sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo eliminar duplicados en una tabla?

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.