从未交手过的回归球队 - SQL

Return teams that have never played each other - SQL

提问人:zaf 提问时间:11/16/2022 更新时间:11/16/2022 访问量:56

问:

我有表格匹配项

id_match id_team1 id_team2
1 美国 日本
2 澳大利亚 美国
3 FA+(英语:FA+) 油料
4 油料 美国

和表团队

id_team 名字
美国 美国
日本 日本
... ...

我想返回一张从未像这样交手过的球队的新表格

id_team1 id_team2
美国 澳大利亚
FA+(英语:FA+) 美国
... ...

我想我必须使用交叉连接和减法,但我无法确切地想到如何做到这一点。 如果有人能想到如何去做,或者更简单的方法,我将不胜感激!

SQL PostgreSQL 连接 匹配

评论


答:

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:是的;第二个查询就是这样做的