簡體   English   中英

SQL - 將2個外鍵連接到1個主鍵

[英]SQL - Left join 2 foreign keys to 1 primary key

我有兩個表,游戲和團隊。 我的sql語句應該如何制作一個鏈接到TeamID1和TeamID2字段的TeamName的游戲列表? 我相信我可以使用左連接,但我不知道如何處理鏈接到一個主鍵的兩個外鍵。 非常感謝您提供的任何幫助。

游戲

游戲ID
TeamID1
TeamID2
結果

小組

TeamID
隊名

我經常看到人們在同一個查詢中加入一個表或多次加入表的想法(就像在這里一樣)。 一旦掌握,對於在行之間有很多關系的表(例如必須互相玩的團隊列表!),這是一種很好的技術。 正如其他人指出的那樣,你需要使用兩個inner join來完成這個:

select
    *
from
    games g
    inner join teams t1 on
        g.teamid1 = t1.teamid
    inner join teams t2 on
        g.teamid2 = t2.teamid

所以,如果你的games桌看起來像這樣:

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          2          1

您將獲得以下結果集:

g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
----------------------------------------------------------------------------------
       1            1            3            1    Lions              3    Bears
       2            4            2            4    Oh My              2    Tigers
       3            2            1            2    Tigers             1    Lions

當然,出於可用性的考慮,我會在select語句中為這些列添加別名,如果我是我的話:

select
    g.GameID,
    t1.Name as Team1,
    t2.Name as Team2
from
    ...

這樣,可以適當地命名列,而不是讓t1t2列共享相同的名稱。

現在,解決關於left join是什么的混淆。 您會看到, left join將從第一個(或左)表中獲取所有行,然后將連接條件上的所有行與第二個(或右)表匹配。 對於左表中的任何行, right表上的所有列都將顯示null

深入研究一個例子,假設有人因為某種原因在其中TeamID2上為TeamID2輸入了一個null 我們還說團隊TeamID 4的團隊曾經存在過,但現在已不復存在了。

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          1       null

現在,讓我們看一下left join在查詢方面的含義:

select
    *
from
    games g
    left join teams t1 on
        g.teamid1 = t1.teamid
    left join teams t2 on
        g.teamid2 = t2.teamid

從邏輯上講,這將抓住我們所有的games ,然后將它們與各自的teams匹配。 但是,如果TeamID不存在,我們將獲得null 它看起來像這樣:

g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
----------------------------------------------------------------------------------
       1            1            3            1    Lions              3    Bears
       2            4            2         null    null               2    Tigers
       3            1         null            1    Lions           null    null

因此, 只有團隊是可選的, 需要left join

在您的情況下,您將使用inner join多次加入表。 這是一種非常常見的做法,非常有用。 它避免了子查詢的一些缺陷(特別是在MySQL上),同時允許您從表中獲取數據以進行內部比較。 在嘗試查找某些內容或相關行的順序時,這非常有用。

無論如何,我希望這個非常漫無邊際的答案可以幫助某個人。

SELECT *
FROM Games G
INNER JOIN Teams T1
   ON G.TeamID1 = T1.TeamID
INNER JOIN Teams T2
   ON G.TeamID2 = T2.TeamID

除非游戲中的兩支球隊中的一支是可選的,否則我認為你不需要左外連接。 從邏輯上講,似乎兩者都是必需的,所以你的查詢看起來像這樣:

SELECT *
FROM Games AS G
INNER JOIN Teams AS T1 ON T1.TeamID = G.TeamID1
INNER JOIN Teams AS T2 ON T2.TeamID = G.TeamID2

如果TeamID1和TeamID2不是NULL,那么你想使用INNER JOIN,否則你可以使用LEFT JOIN。

您需要使用別名:

SELECT GameID, team1.TeamName, team2.TeamName
FROM Games INNER JOIN teams team1 ON (Games.TeamID1 = team1.TeamID)
           INNER JOIN teams team2 ON (Games.TeamID2 = team2.TeamID)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM