2016-12-09 38 views
0

我有以下表格:如何加入這些表中的SQL

match 

id | rival_team 
---------------------- 
| 1 | chelsea fc 
| 2 | real madrid 


    player 

ID | name | last_name | 
--------------------------------- 
| 1 | John |  Doe  | 
| 2 | Peter | Williams | 


    called_up_players 

match_id | player_id | substitution_id |  
---------------------------|-------------------| 
|  1  |  1  |   1   | 
|  1  |  2  |  NULL  | 


    substitution 

|  id | match_id | substitute_player_id | replaced_player_id | 
---------------------------|----------------------|--------------------| 
|  1  |  1  |   1   |   2   | 

我有以下SQL語句

SELECT called_up_players.match_id, match.rival_team, player.name, 
      player.last_name, substitution.id 
FROM called_up_players, substitution, player, match 
WHERE called_up_players.substitution_id = substitution.substitute_player_id 
     AND player.id = called_up_players.substitution_id; 

及以下的輸出:

match_id| rival_team | name | last_name | substitution_id 
--------+------------+----------+-----------+----------- 
     1 | chelsea fc | John | Doe |   1 
     1 | real madrid| John | Doe |   1 
(2 rows) 

然而,我想輸出像

match_id| rival_team | name | last_name | substitution_id 
--------+------------+----------+-----=-----+---------------- 
     1 | chelsea fc | John | Doe |   1 
     2 | real madrid| John | Doe |  NULL 

顯示John Doe被列入名單的所有比賽。無論玩家是否參與替換,我想要列名稱和替換ID號

我想我可以使用JOINS來實現這一點,但我不知道如何連接表,所以我可以有類似的東西到上面的輸出。我嘗試了很多聲明我有錯誤。

+1

你得到了什麼錯誤? –

+1

在你的例子中,'match_id'應該爲'real madrid'的1嗎?即'chelsea fc'正在match_id = 1播放'真正的馬德里'。 –

+0

錯誤類似於「有表格的條目」,但它不能從查詢的這部分引用「...但我沒有明確地說出它因爲我真的不知道如何加入工作。我期待一些指導 – c2J

回答

0

感謝Learning2Code他的回答我瞭解多一點加入,最後,我想出了一個答案,得到我想要的輸出。

而不是使用INNER JOIN的,我使用LEFT JOIN,這樣,所有記錄都從表中左側檢索,如果沒有從右邊的表格數據,本場就是一句

SELECT match_id, rival_team, name, last_name, substitution_id   
FROM match 
LEFT JOIN called_up_players ON called_up_players.match_id = match.id 
LEFT JOIN player ON player.id = called_up_player.player_id 
LEFT JOIN substitution ON called_up_players.substitution_id = substitution.substitution_id 
WHERE player.name = 'John' AND player.last_name = 'Doe'; 

輸出:

partido_id | contrario | nombre | apellido | cambio_id 
-------------+------------+------------+-----------+------------ 
      1 | chelsea fc | John  | Doe  |   1 
      2 | real madrid| John  | Doe  | 
(2 rows) 
2

您正在加入匹配而沒有連接條件,因此這成爲一個交叉連接而不是內部連接。

這就是爲什麼不同的連接語法被認爲是最好的做法了一個例子:

FROM called_up_players 
INNER JOIN substitution ON called_up_players.substitution_id = substitution.substitute_player_id 
INNER JOIN player ON player.id = called_up_players.substitution_id 
INNER JOIN match ON ??? 
+0

我想我明白了。所以,你建議不要使用內部連接(你在答案中使用的連接),因爲在匹配表上沒有連接條件? – c2J

+0

我建議使用內部連接,你只需要一個最終連接的條件。 – Learning2Code

+0

對我來說,你似乎需要一個團隊表。那麼也許你的比賽表可以有三列,matchID,team1ID,team2ID。如果你有一張球隊桌,你也可以將球員與球隊聯繫起來。 – Learning2Code