SQL JOIN和LEFT OUTER JOIN

时间:2014-06-19 18:14:50

标签: sql oracle join outer-join

我一直无法理解这个例子,我有答案,但我无法解决这个问题。连接是如何工作的?

检查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_IDNULL

哪个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);

3 个答案:

答案 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的9manager_id,并将其与其经理A先生的9相匹配,以便经理的信息现在也在桌面上,{ {1}}和player_id将显示A先生的姓名。第二次加入采用m.last_name并简单地将其与团队表匹配,将m.first_name附加到表格中的玩家信息。

如果没有样本数据和图表,很难解释。抱歉。

答案 2 :(得分:0)

更容易思考的方法是分别查看每个joins

Left Outer JoinJoin的一种类型,它在提供的配对上将两个表连接在一起,如果存在匹配,则从右侧提取数据。但如果找不到匹配项,则从右侧返回的数据只是Null。这与Inner Join不同,如果没有找到匹配,则简单地省略记录。

为此,玩家可能有也可能没有经理,因此如果玩家有一个Left Outer Join,则可以使用Player撤回经理的Null记录经理,或如果玩家没有,它将返回Left Outer Join

同样,玩家可能在团队中,也可能不在团队中,因此如果玩家在团队中,TeamTeam可以撤回Null信息,否则它将是Select

Join语句只是选择要从三个表中显示哪些字段。

这里可以看到不同类型{{1}}的一个很好的例子:Difference Between Inner and Outer Joins