私は次の表を持っています
drop table names;
create table names(
name varchar(200),
surname varchar(200),
primary key(name, surname)
);
insert into names values ('john', 'doe');
insert into names values ('john', 'richards');
名前が同じ姓をリストアップしたいと思います。つまり、この結果が欲しい
----------+----------
doe | richards
doe | doe
richards | richards
(これは一例であり、実際の問題はかなり異なります)
次のクエリは重複を返します
select n1.surname, n2.surname
from names n1 join names n2
on n1.name = n2.name;
surname | surname
----------+----------
doe | richards
doe | doe
richards | richards
richards | doe
それで、私はleast
およびgreatest
postgresql 関数を使用して、結果を得ました。しかし:least
とgreatest
は標準 SQL ではありません。今では想像できない結合条件を使用するため、より効率的なソリューションが存在するかどうか疑問に思っていました。
select distinct least(n1.surname, n2.surname), greatest(n1.surname,
n2.surname)
from names n1 join names n2
on n1.name = n2.name;
least | greatest
----------+----------
doe | richards
doe | doe
richards | richards