Wiem, że to pytanie jest bardzo podobne do tego: Symetryczne połączenie krzyżowe i ten też: kombinacje (nie permutacje) z połączenia krzyżowego w sql

Ale co jeśli mamy dwa różne stoły, powiedzmy A i B:

select A.id,B.id from A cross join B

I chcę rozważyć parę (a,b) równą (b,a) ?

17
Felice Pollano 17 październik 2012, 14:15

2 odpowiedzi

Najlepsza odpowiedź
select A.id aid,B.id bid
from A inner join B on a.id <= b.id
union
select B.id,A.id
from A inner join B on b.id < a.id

Jeśli chcesz być bardziej wyrafinowany:

select distinct
       case when a.id<=b.id then a.id else b.id end id1,
       case when a.id<=b.id then b.id else a.id end id2
from A cross join B

W mojej małej nienaukowej wypiekaniu z malutkimi stolikami ten drugi był szybszy. A poniżej wyrażenia case zapisane jako podzapytania.

select distinct
       (select MIN(id) from (select a.id union select b.id)[ ]) id1,
       (select MAX(id) from (select a.id union select b.id)[ ]) id2
from A cross join B
19
RichardTheKiwi 17 październik 2012, 14:33

Czy nie dałoby to również pożądanego rezultatu?

select A.id,B.id from A cross join B on A.id >= B.id
1
Yash 29 czerwiec 2020, 13:15