繁体   English   中英

SQL JOIN和LEFT OUTER JOIN

[英]SQL JOIN and LEFT 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);

在您的示例中,同时也是经理的球员在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表中的任何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)

我希望这有帮助!

因此,第一个LEFT OUTER JOIN进入玩家表,然后为每个玩家经理添加信息。 每个玩家都有其经理的ID ,该经理也是具有ID的玩家。 如果A先生(具有player_id 9 )是Ted的经理(具有player_id 5 ,那么Ted的manager_id将为9 第一个manager_id Ted的manager_id 9 ,并将其与他的经理A先生的player_id匹配,以便经理的信息现在也出现在表中,并且m.last_namem.first_name将显示A先生的名字。 。 第二个team_id并将其简单地与团队表匹配,将team_name附加到表中的玩家信息上。

没有示例数据和图表,很难解释。 抱歉。

考虑它的一种更简单的方法是单独查看每个joins

Left Outer Join是一种类型的Join联接两个表一起所提供的配对,并且如果存在匹配,数据被从右手侧牵拉。 但是,如果找不到匹配项,则从右侧返回的数据将只是Null 这与Inner Join不同,在Inner Join ,如果找不到匹配项,则将记录省略。

为此,玩家可能有也可能没有经理,因此,如果该玩家有经理,则使用Left Outer Join来拉回该经理的Player记录,或者如果该玩家没有经理,则它将返回Null

同样,一个玩家可能在团队中也可能不在团队中,因此如果该玩家在团队中,则在“ Left Outer Join Joining”到“ Team表中以拉回“ Team信息,否则将为Null

Select语句仅从三个表中选择要显示的字段。

可以在这里看到不同类型的Join的一个很好的例子: 内部联接和外部联接之间的区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM