[英]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_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);
在您的示例中,同时也是经理的球员在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_name
和m.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.