Hierdoor blijft een van de duplicaten behouden:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Uw tafel heeft geen unieke identificatie die kan worden gebruikt om "één overlevende te kiezen". Dat is waar Postgres' ctid
is handig, want het is een interne unieke identifier voor elke rij. Merk op dat je nooit de ctid
. moet gebruiken voor meer dan een enkele verklaring. Het is niet universeel uniek, maar voor de looptijd van een enkele verklaring is het prima.
SQLFiddle-voorbeeld:http://sqlfiddle.com/#!15/dabfc/1
Als je van alles af wilt komen rijen die zijn gedupliceerd:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Geen van beide oplossingen zal snel zijn op een grote tafel. Het maken van een nieuwe tabel zonder duplicaten, zoals jjanes heeft laten zien, gaat veel sneller als u een aanzienlijk aantal rijen uit een grote tabel nodig heeft.