[英]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
...
這樣,可以適當地命名列,而不是讓t1
和t2
列共享相同的名稱。
現在,解決關於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.