Detta kommer att behålla en av dubbletterna:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Din tabell har ingen unik identifierare som kan användas för att "välja en överlevande". Det är där Postgres ctid
är praktiskt eftersom det är en intern unik identifierare för varje rad. Observera att du aldrig ska använda ctid
för mer än bara ett påstående. Det är inte en universellt unik sak men för körtiden för ett enstaka uttalande är det bara bra.
Exempel på SQLFiddle:http://sqlfiddle.com/#!15/dabfc/1
Om du vill bli av med alla rader som är duplicerade:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Ingen av lösningarna kommer att vara snabb på ett stort bord. Att skapa en ny tabell utan dubbletter som jjanes har visat kommer att gå mycket snabbare om du behöver ett stort antal rader från en stor tabell.