我一直无法理解这个例子,我有答案,但我无法解决这个问题。连接是如何工作的?
检查PLAYER和TEAM表的结构:
PLAYER
-------------
PLAYER_ID NUMBER(9) PK
LAST_NAME VARCHAR2(25)
FIRST_NAME VARCHAR2(25)
TEAM_ID NUMBER
MANAGER_ID NUMBER(9)
TEAM
----------
TEAM_ID NUMBER PK
TEAM_NAME VARCHAR2(30)
对于此示例,团队经理也是玩家,MANAGER_ID
列引用PLAYER_ID
列。对于经理人,MANAGER_ID
为NULL
。
哪个SELECT
语句会提供所有玩家的列表,包括玩家的名字,团队名称和玩家经理的名字?
解答:
SELECT p.last_name, p.first_name, m.last_name, m.first_name, t.team_name
FROM player p
LEFT OUTER JOIN player m ON (p.manager_id = m.player_id)
LEFT OUTER JOIN team t ON (p.team_id = t.team_id);
答案 0 :(得分:3)
在您的示例中,也是管理员的玩家在manager_id列中具有空值。获取SQL语句的第一部分,即:
SELECT p.last_name, p.first_name, m.last_name, m.first_name, t.team_name
FROM player p
LEFT OUTER JOIN player m ON (p.manager_id = m.player_id)
由于您正在执行LEFT JOIN(而不是INNER JOIN),您的经理记录将不会被过滤掉(即使它们在manager_id列中的NULL值不会成功加入到播放器表中的任何player_id),对于那些经理玩家,m.last_name和m.first_name将为NULL。
如果您要将该查询更改为INNER JOIN,那么查询将根本不会返回您也是管理员的玩家,因为他们对manager_id有一个NULL值,并且没有玩家记录的player_id为NULL。
SELECT p.last_name, p.first_name, m.last_name, m.first_name, t.team_name
FROM player p
INNER JOIN player m ON (p.manager_id = m.player_id)
我希望这有帮助!
答案 1 :(得分:2)
所以第一个LEFT OUTER JOIN
获取玩家表,然后添加每个玩家经理的信息。每个玩家的经理都有一个ID
,他也是ID
的玩家。如果A先生({1}}是Ted的经理,player_id 9
,则Ted的manager_id将为player_id 5
。第一次加入需要Ted的9
,manager_id
,并将其与其经理A先生的9
相匹配,以便经理的信息现在也在桌面上,{ {1}}和player_id
将显示A先生的姓名。第二次加入采用m.last_name
并简单地将其与团队表匹配,将m.first_name
附加到表格中的玩家信息。
如果没有样本数据和图表,很难解释。抱歉。
答案 2 :(得分:0)
更容易思考的方法是分别查看每个joins
。
Left Outer Join
是Join
的一种类型,它在提供的配对上将两个表连接在一起,如果存在匹配,则从右侧提取数据。但如果找不到匹配项,则从右侧返回的数据只是Null
。这与Inner Join
不同,如果没有找到匹配,则简单地省略记录。
为此,玩家可能有也可能没有经理,因此如果玩家有一个Left Outer Join
,则可以使用Player
撤回经理的Null
记录经理,或如果玩家没有,它将返回Left Outer Join
。
同样,玩家可能在团队中,也可能不在团队中,因此如果玩家在团队中,Team
表Team
可以撤回Null
信息,否则它将是Select
。
Join
语句只是选择要从三个表中显示哪些字段。
这里可以看到不同类型{{1}}的一个很好的例子:Difference Between Inner and Outer Joins