提问人:zaf 提问时间:11/16/2022 更新时间:11/16/2022 访问量:56
从未交手过的回归球队 - SQL
Return teams that have never played each other - SQL
问:
我有表格匹配项
id_match | id_team1 | id_team2 |
---|---|---|
1 | 美国 | 日本 |
2 | 澳大利亚 | 美国 |
3 | FA+(英语:FA+) | 油料 |
4 | 油料 | 美国 |
和表团队
id_team | 名字 |
---|---|
美国 | 美国 |
日本 | 日本 |
... | ... |
我想返回一张从未像这样交手过的球队的新表格
id_team1 | id_team2 |
---|---|
美国 | 澳大利亚 |
FA+(英语:FA+) | 美国 |
... | ... |
我想我必须使用交叉连接和减法,但我无法确切地想到如何做到这一点。 如果有人能想到如何去做,或者更简单的方法,我将不胜感激!
答:
0赞
GMB
11/16/2022
#1
您可以将 teams 表与自身交叉联接以生成所有可能的匹配组合,然后排除那些已经发生的匹配组合:not exists
如果您同时想要 team1/team2 和 team2/team1 游戏,则:
select t1.id_team id_team1, t2.id_team id_team2
from teams t1
inner join teams t2 on t1.id_team != t2.id_team
where not exists (
select 1 from matches m where m.id_team1 = t1.id_team and m.id_team2 = t2.id_team2
)
如果你想让每对球队之间进行一场比赛,那么我们需要添加一些条件逻辑:
select t1.id_team id_team1, t2.id_team id_team2
from teams t1
inner join teams t2 on t1.id_team < t2.id_team
where not exists (
select 1
from matches m
where t1.id_team = least(m.id_team1, m.id_team2)
and t2.id_team = greatest(m.id_team1, m.id_team2)
)
评论
0赞
zaf
11/16/2022
感谢您的回复!我忘了说,重要的是,只希望组合出现一次
0赞
GMB
11/16/2022
@Aguss:是的;第二个查询就是这样做的
上一个:SQL 匹配日期和产品
下一个:在联接表中仅查找完全匹配项
评论