我有一个表格,其中包含比赛标识符和相应的球员/球队标识符,表示为
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
:
tid | 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) |
这似乎给了你你想要的 - 尽管你真的应该首先修复你的数据模型:
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
;
您拥有所需的所有数据,只是没有选择它。像这样的东西应该有帮助:
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
匹配对应 ID 的标准选择所有存在球员或球队的比赛。您可能会面临的问题是 tid
可能等于 pid
,因此两者可能会混淆。