2

私は次の表を持っています

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およびgreatestpostgresql 関数を使用して、結果を得ました。しかし:leastgreatestは標準 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
4

1 に答える 1

2

タイブレーカーのみが必要な場合は、< of > または >= または <= を使用します

SELECT n1.surname, n2.surname
FROM names n1 
JOIN names n2 ON n1.name = n2.name
WHERE n1.surname >= n2.surname
   ;
于 2012-07-04T15:58:37.027 に答える