Уникальное сочетание, при котором каждое значение появляется только один раз с каждой стороны - PullRequest
0 голосов
/ 27 мая 2020

У меня есть эта таблица с двумя столбцами 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

Думайте об этом как об отдельных игроках, которых нужно распределить на отборочный турнир первого раунда, и каждый игрок может сыграть только один раз в первом раунде. Но из-за доступности возможны не все комбинации. Это будет запрос для матчей первого дня, тот, кто не получит матч в первом раунде, будет помещен в пул для матчей второго дня. Так что наличие нескольких игроков без матчей в первый день - это не проблема, но тем не менее я стараюсь максимально увеличить количество игр в первый день.

Я думаю, мне нужно сделать что-то вроде объединения столбцов p1 p2 и каким-то образом сделать его эквивалентным p2 p1, а затем выбрать оттуда разные и снова разделить их.

1 Ответ

1 голос
/ 27 мая 2020

Вы можете получить совпадающие пары, используя соединение. Это сгенерирует все из них:

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) для возврата произвольной отдельной строки.

Здесь - это скрипт db <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...