Как получить значения двух столбцов внешнего ключа, если они соответствуют одному и тому же ключу?

Мне нужна помощь в SQL относительно этой базы данных https://www.kaggle.com/hugomathien/soccer. Мне нужен оператор SQL, который дает таблицу с названием домашней и гостевой команд для случайной игры (я выбрал Match.match_api_id = 492476) Если я запускаю это:

SELECT Team.team_long_name , Match.home_team_api_id
FROM Team JOIN Match
ON Match.away_team_api_id = Team.team_api_id 
WHERE Match.match_api_id = 492476;  

Я получаю название гостевой команды, но не название домашней команды (вместо этого я получаю значение Match.home_team_api_id, как и ожидалось). Если я бегу:

SELECT Team.team_long_name , Match.away_team_api_id
FROM Team JOIN Match
ON Match.home_team_api_id = Team.team_api_id 
WHERE Match.match_api_id = 492476;  

Я получаю название команды хозяев, но не название команды гостей (вместо этого я получаю значение Match.away_team_api_id, как и ожидалось). Проблема в том, что оба внешних ключа Match.home_team_api_id и Match.away_team_api_id соответствуют : Team.team_api_id , поэтому, когда я получаю один, я «теряю» другой.

Есть ли оператор SQL, чтобы получить как название домашней команды, так и название выездной команды случайного совпадения в одной таблице?

🤔 А знаете ли вы, что...
SQL можно использовать для создания резервных копий и восстановления данных.


23
2

Ответы:

Вы можете присоединиться к таблице Team дважды, один раз за команду гостей и один раз за команду хозяев. Псевдонимы для таблиц помогают отслеживать, что есть что. Что-то вроде:

SELECT 
 hometeam.team_long_name homename,
 Match.home_team_api_id, 
 awayteam.team_long_name awayname, 
 Match.away_team_api_id
FROM Match INNER JOIN Team hometeam
  ON Match.home_team_api_id = hometeam.team_api_id
 INNER JOIN Team awayteam
  ON Match.away_team_api_id = awayteam.team_api_id 
WHERE Match.match_api_id = 492476

Решено

Во-первых, если критерии выбора касаются исключительно стола Match, это должен быть первый стол, который вы упомянули.

Во-вторых, вам разрешено использовать JOIN (или INNER JOIN, как чаще пишут) более одного раза.

SELECT T1.team_long_name as Away_team_long_name,
       T2.team_long_name as Home_team_long_name
FROM Match
   INNER JOIN Team as T1
      ON Match.away_team_api_id = T1.team_api_id 
   INNER JOIN Team as T2
      ON Match.home_team_api_id = T2.team_api_id
WHERE Match.match_api_id = 492476;  

Перефразируя это как человеческую процедуру:

  1. Используйте match_api_id, чтобы найти строку Match в таблице Match.
  2. Возьмите away_team_api_id из строки Match и используйте ее для поиска команды в таблице Team. Сообщите team_long_name этой команды как полное название команды гостей.
  3. Возьмите home_team_api_id из строки Match и используйте ее для поиска команды в таблице Team. Сообщите team_long_name этой команды как длинное название домашней команды.