web-dev-qa-db-fra.com

Comment sélectionner des enregistrements avec deux colonnes correspondant à des valeurs dans une table dans PostgreSQL?

J'ai un tableau avec la structure et les données ci-dessous:

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');  

Maintenant, je veux récupérer les enregistrements dont les deux colonnes name et father_name correspondent les uns aux autres.
Le résultat souhaité serait le suivant:

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  

Toute aide est appréciée à l'avance.

1
Abdul Raheem Ghani

Commande par name et father_name est la première étape, mais je suppose que vous ne voulez pas d'enregistrements où aucun autre enregistrement correspondant n'est trouvé. Cela fonctionnerait:

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

Ici est une démo qui fonctionne.

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