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.