Dadurch wird eines der Duplikate behalten:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Ihre Tabelle hat keine eindeutige Kennung, die verwendet werden könnte, um „einen Überlebenden auszuwählen“. Dort befindet sich die ctid
von Postgres ist praktisch, da es sich um eine interne eindeutige Kennung für jede Zeile handelt. Beachten Sie, dass Sie niemals ctid
verwenden sollten für mehr als nur eine einzelne Aussage. Es ist kein universell einzigartiges Ding, aber für die Laufzeit einer einzelnen Anweisung ist es völlig in Ordnung.
SQLFiddle-Beispiel:http://sqlfiddle.com/#!15/dabfc/1
Wenn Sie alle loswerden möchten doppelte Zeilen:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Keine Lösung wird auf einem großen Tisch schnell sein. Das Erstellen einer neuen Tabelle ohne Duplikate, wie jjanes gezeigt hat, wird viel schneller sein, wenn Sie eine beträchtliche Anzahl von Zeilen aus einer großen Tabelle benötigen.