Tím zůstane jeden z duplikátů:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Váš stůl nemá jedinečný identifikátor, který by mohl být použit k "vybrat jednoho přeživšího". To je místo ctid
Postgresu přijde vhod, protože jde o interní jedinečný identifikátor pro každý řádek. Pamatujte, že byste nikdy neměli používat ctid
pro více než jen jeden výrok. Není to univerzálně jedinečná věc, ale pro běh jednoho příkazu je to v pořádku.
Příklad SQLFiddle:http://sqlfiddle.com/#!15/dabfc/1
Pokud se chcete zbavit všech řádky, které jsou duplicitní:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Ani jedno řešení nebude rychlé na velkém stole. Vytvoření nové tabulky bez duplikátů, jak ukázal jjanes, bude mnohem rychlejší, pokud potřebujete značný počet řádků z velké tabulky.