У меня есть таблица с идентификаторами матчей и соответствующими идентификаторами игроков/команд, выраженными как 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
:
players
:
teams
:
Желаемый результат:
У вас есть все необходимые данные, просто вы их не выбираете. Что-то вроде этого должно помочь:
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
;
LEFT OUTER JOIN PLAYERS P ON M1.HOME_ID = P.PID WHERE P.PID IS NOT NULL
можно переписать какJOIN PLAYERS P ON M1.HOME_ID = P.PID
. Подобную перезапись можно использовать и для другой ветви объединения.