PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment supprimer les doublons dans une table ?

Cela conservera l'un des doublons :

delete from join_table
where ctid not in (select min(ctid)
                   from join_table
                   group by id1, id2);

Votre table n'a pas d'identifiant unique qui pourrait être utilisé pour "choisir un survivant". C'est là que le ctid de Postgres est pratique, car il s'agit d'un identifiant interne unique pour chaque ligne. Notez que vous ne devez jamais utiliser le ctid pour plus qu'une simple déclaration. Ce n'est pas une chose universellement unique, mais pour l'exécution d'une seule instruction, c'est très bien.

Exemple SQLFiddle :http://sqlfiddle.com/#!15/dabfc/1

Si vous voulez vous débarrasser de tous lignes dupliquées :

delete from join_table
where (id1, id2) in (select id1, id2
                     from join_table
                     group by id1, id2
                     having count(*) > 1);

Aucune des deux solutions ne sera rapide sur une grande table. La création d'une nouvelle table sans doublons comme jjanes l'a montré sera beaucoup plus rapide si vous avez besoin d'un nombre substantiel de lignes à partir d'une grande table.