web-dev-qa-db-ja.com

PostgreSQLの1つのテーブルで値に一致する2列のレコードを選択するにはどうすればよいですか?

以下の構造とデータのテーブルがあります。

create table employee (id int, name varchar, father_name varchar);
insert into employee values(1, 'John', 'Alex'),(2, 'Simi', 'Expatri'),(3, 
'John', 'Alex'),(4, 'Hezad', 'Ambrose'),(5, 'John', 'Alex'), (6, 'Simi', 
'Expatri'), (7, 'Hezad', 'Ambrose'), (8, 'John', 'Reman'), (9, 'Komal', 
'Ambrose');  

次に、2つの列namefather_nameが互いに一致するレコードをフェッチします。
望ましい結果は次のようになります:

id    |    name    |    father_name
1     |    John    |    Alex  
3     |    John    |    Alex  
5     |    John    |    Alex  
2     |    Simi    |    Expatri  
6     |    Simi    |    Expatri  
4     |    Hezad   |    Ambrose  
7     |    Hezad   |    Ambrose  

どんな助けでも事前に感謝されます。

1

nameおよびfather_nameによる順序付けが最初のステップですが、他の一致するレコードが見つからないレコードは不要だと思います。これはうまくいくでしょう:

select e1.id, e1.name, e1.father_name
  from employee as e1
  inner join employee as e2
    on e1.name = e2.name
   and e1.father_name = e2.father_name
   and e1.id != e2.id
  group by e1.id, e1.name, e1.father_name
  order by e1.name, e1.father_name

ここ は実用的なデモです。

1
Glorfindel
select id, name, father_name
  from employee
  where (name, father_name) in (
     select name, father_name
       from employee
       group by name, father_name
       having count(*) > 1
     )
  order by father_name, name
0
Gerard H. Pille