[英]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.