如何在SQL中连接这些表

时间:2016-12-09 23:35:50

标签: sql postgresql join

我有以下表格:

   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被召集到名单的所有比赛。无论玩家参与替换,我都想拥有名称和substitution_id

的列

我想我可以使用JOINS实现这一点,但我不知道如何连接表,所以我可以有类似于上面的输出。我尝试了许多声明,但我得到了错误。

2 个答案:

答案 0 :(得分: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 ???

答案 1 :(得分:1)

感谢Learning2Code和他的回答我更了解连接,最后,我想出了一个答案来获得我想要的输出。

我没有使用INNER JOIN,而是使用LEFT JOIN,以便从左边的表中检索所有记录,如果右边的表中没有数据,则该字段为空

<uses-permission android:name="android.permission.WAKE_LOCK" tools:node="remove" />

输出:

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';