对于每场比赛,选择主场球员/球队的球员标识符

问题描述 投票:0回答:2

我有一个表格,其中包含比赛标识符和相应的球员/球队标识符,表示为

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)
sql sqlite
2个回答
1
投票

这似乎给了你你想要的 - 尽管你真的应该首先修复你的数据模型:

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
;

1
投票

您拥有所需的所有数据,只是没有选择它。像这样的东西应该有帮助:

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
,因此两者可能会混淆。

© www.soinside.com 2019 - 2024. All rights reserved.