Dette vil beholde en af dubletterne:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Din tabel har ikke en unik identifikator, der kan bruges til at "vælge en overlevende". Det er her Postgres' ctid
er praktisk, da det er en intern unik identifikator for hver række. Bemærk, at du aldrig bør bruge ctid
for mere end blot et enkelt udsagn. Det er ikke universelt unikke ting, men for kørselstiden af en enkelt erklæring er det helt fint.
SQLFiddle-eksempel:http://sqlfiddle.com/#!15/dabfc/1
Hvis du vil slippe af med alt rækker, der er duplikeret:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Ingen af løsningerne vil være hurtige på et stort bord. At oprette en ny tabel uden dubletter, som jjanes har vist, vil være meget hurtigere, hvis du har brug for et betydeligt antal rækker fra en stor tabel.