Для каждого матча выберите идентификаторы игрока/команды хозяев

У меня есть таблица с идентификаторами матчей и соответствующими идентификаторами игроков/команд, выраженными как home_id. Каждая команда tid состоит из двух игроков, и у каждого игрока есть свой идентификатор pid. В таблице matches я не знаю, представляет ли столбец home_id команду или одного игрока.

Я хотел бы добавить столбцы home_ids для каждого матча, которые представляют идентификаторы игрока/команды хозяев. Я написал следующий запрос, который дает:

Результат: значение строки использовано неправильно

SELECT match_id,
CASE WHEN (SELECT pid FROM players WHERE m.home_id = pid)
            IS NULL THEN (SELECT pid_1, pid_2 FROM teams WHERE m.home_id = tid)
        ELSE (m.home_id)
    END AS home_ids
FROM matches m

Как изменить мой запрос, чтобы он работал так, как задумано?

Таблица matches:

match_id home_id 18707060 149612 18707060 548355 18389439 146458 18389439 316081 18389511 334757 18389511 402979 18390491 87940 18390491 185150 18390555 164088 18390555 164374 18390785 95493 18390785 532349 14487258 24552 14487258 306032

players:

pid 87940 185150 164088 164374 24552 306032

teams:

время pid_1 pid_2 149612 149613 149728 548355 316251 316343 146458 146728 235888 316081 316073 316081 334757 334750 316079 402979 558506 558508 95493 315993 315997 532349 563020 563022

Желаемый результат:

match_id home_ids 18707060 (149613, 149728) 18707060 (316251, 316343) 18389439 (146728, 235888) 18389439 (316073, 316081) 18389511 (334750, 316079) 18389511 (558506, 558508) 18390491 (87940) 18390491 (185150) 18390555 (164088) 18390555 (164374) 18390785 (315993, 315997) 18390785 (563020, 563022) 14487258 (24552) 14487258 (306032)

🤔 А знаете ли вы, что...
SQL поддерживает фильтрацию данных с использованием условий WHERE.


70
2

Ответы:

У вас есть все необходимые данные, просто вы их не выбираете. Что-то вроде этого должно помочь:

SELECT m.match_id, p.pid AS p_pid, t.pid_1 AS t_pid_1, t.pid_2 AS t_pid_2
FROM matches m
LEFT JOIN players p
ON m.home = p.pid
LEFT JOIN teams t
ON m.home = t.tid
WHERE
   NOT (
           p.pid IS NULL AND
           t.tid IS NULL
       )

По сути, мы выбираем все матчи, в которых существует игрок или команда с критериями соответствия m.home соответствующему идентификатору. Проблема, с которой вы, скорее всего, столкнетесь, заключается в том, что tid может быть равно pid, поэтому их можно путать.


Решено

Кажется, это дает вам то, что вы хотите, хотя вам действительно следует сначала исправить свою модель данных:

SELECT M1.MATCH_ID
,P.PID HOME_IDS
FROM MATCHES M1
LEFT OUTER JOIN PLAYERS P ON M1.HOME_ID = P.PID
WHERE P.PID IS NOT NULL
UNION
SELECT M2.MATCH_ID
,T1.PID_1||', '||T1.PID_2 HOME_IDS
FROM MATCHES M2
LEFT OUTER JOIN TEAMS T1 ON M2.HOME_ID = T1.TID
WHERE T1.TID IS NOT NULL
order by 1,2
;