postgresql 返回从未交手过的球队- SQL

irtuqstp  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(81)

我有桌上的火柴
| id_匹配|标识团队1|团队标识2|
| - -|- -|- -|
| 一个|美国|日本|
| 2个|澳大利亚|美国|
| 三个|CAN总线|石油|
| 四个|石油|美国|
而桌上的队伍
| id_团队|姓名|
| - -|- -|
| 美国|美利坚合众国|
| 日本|日本Name|
| 一个人。|一个人。|
我还想把一张新的表还给那些从来没有像这样比赛过的球队。
| 标识团队1|团队标识2|
| - -|- -|
| 美国|澳大利亚|
| CAN总线|美国|
| 一个人。|一个人。|
我想我必须使用交叉连接和减法,但我不知道具体如何做。如果有人能想到如何做,或更简单的方法,我真的很感激!

n53p2ov0

n53p2ov01#

您可以将teams表与其自身交叉联接,以生成所有可能的匹配组合,然后排除那些已经使用not exists发生的匹配组合:
如果您同时需要team 1/team 2和team 2/team 1游戏,则:

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)
)

相关问题