使用自聯接:
create table a_table (cola int, colb int);
insert into a_table values
(1, 4), (2, 5), (3, 6);
select *
from a_table a
join a_table b
on a.cola < b.cola and a.colb <> b.colb;
cola | colb | cola | colb
------+------+------+------
1 | 4 | 2 | 5
1 | 4 | 3 | 6
2 | 5 | 3 | 6
(3 rows)
上面的查詢工作得很好,如果列cola
是獨一無二的。 如果cola
值可以重來,你應該添加一個附加條件:
insert into a_table values (1, 8);
select *
from a_table a
join a_table b
on a.cola < b.cola and a.colb <> b.colb
or a.cola = b.cola and a.colb < b.colb
order by 1, 2;
cola | colb | cola | colb
------+------+------+------
1 | 4 | 2 | 5
1 | 4 | 3 | 6
1 | 4 | 1 | 8
1 | 8 | 2 | 5
1 | 8 | 3 | 6
2 | 5 | 3 | 6
(6 rows)
似乎是正確的,現在:) – jpw
對於一般的解決方案,在這裏你需要選擇一些任意子集,而不僅僅是對,你可以使用在目標表上進行自連接的遞歸CTE。 –