簡體   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