2016-12-09 2 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 

показать все совпадения, в которых Джон Доу был вызван в список. Независимо от того, что игрок участвовал в замещении, я хотел бы иметь столбцы для имени и substitution_id

Я думаю, что могу добиться этого, используя JOINS, но я не знаю, как присоединиться к столам, поэтому я могу иметь нечто похожее к вышеуказанному выходу. Я пробовал много заявлений, я получил ошибки.

+1

Какие ошибки у вас возникли? –

+1

Должно ли 'match_id' в вашем примере быть 1 для' real madrid'? То есть 'chelsea fc' играют' real madrid' в 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

Смежные вопросы