Esto mantendrá uno de los duplicados:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Su tabla no tiene un identificador único que pueda usarse para "elegir un sobreviviente". Ahí es donde ctid
de Postgres es útil, ya que es un identificador único interno para cada fila. Tenga en cuenta que nunca debe usar el ctid
para algo más que una sola declaración. No son cosas universalmente únicas, pero para el tiempo de ejecución de una sola declaración está bien.
Ejemplo de SQLFiddle:http://sqlfiddle.com/#!15/dabfc/1
Si desea deshacerse de todos filas que están duplicadas:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Ninguna solución será rápida en una mesa grande. Crear una nueva tabla sin duplicados, como ha demostrado jjanes, será mucho más rápido si necesita una cantidad considerable de filas de una tabla grande.