sql—唯一的配对,其中每个值在任意一侧只出现一次

dy1byipe  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(359)

这个表有两列p1,p2。我想最大数量的组合与限制,没有值应该出现在输出中一次以上。p1-p2与p2-p1相同

a - b
a - c
b - c
a - d
e - d
b - d
c - d
e - f
d - f
a - g
e - g
b - g
c - g
d - g
f - g

预期结果:

f - g
d - c
b - a
e nomatchup

这是我在一个简单的临时表中使用的数据。

select * 
into #temptable
from (
select 'a' p1,'b' p2 union all
select 'a','c' union all
select 'b','c' union all
select 'a','d' union all
select 'e','d' union all
select 'b','d' union all
select 'c','d' union all
select 'e','f' union all
select 'd','f' union all
select 'a','g' union all
select 'e','g' union all
select 'b','g' union all
select 'c','g' union all
select 'd','g' union all
select 'f','g' 
) z

把它想象成需要分配给第一轮淘汰赛的不同玩家,每个玩家在第一轮只能玩一次。但由于可用性,并非所有的组合都是可能的。这将是对第一天比赛的查询,谁在第一轮没有得到一个比赛将被放在第二天的比赛池。所以有一些球员在第一天没有比赛不是什么大问题,但我正在努力最大限度地提高第一天的比赛数量。
我想我需要做一些类似于连接p1p2列的事情,以某种方式使其等效于p2p1,然后从那里选择distinct并再次将它们分开。

okxuctiv

okxuctiv1#

您可以使用连接获得匹配对。这将生成所有这些:

select concat(t1.p1, ':', t1.p2),
       concat(t2.p1, ':', t2.p2),
       concat(t3.p1, ':', t3.p2)
from t t1 join
     t t2
     on t2.p1 not in (t1.p1, t1.p2) and
        t2.p2 not in (t1.p1, t1.p2) join
     t t3
     on t3.p1 not in (t1.p1, t1.p2, t2.p1, t2.p2) and
        t3.p2 not in (t1.p1, t1.p2, t2.p1, t2.p2);

你可以用 select top (1) 返回任意一行。
这是一把小提琴。

相关问题