martes, 21 de junio de 2011

Borrar filas duplicadas

De vez en cuando, por ejemplo por la falta de algún índice unico, puede suceder que insertemos registros duplicados en una de nuestras tablas.
Cuando notamos esta "duplicidad" seguramente querremos borrar todos los duplicados y dejar solo 1 registro, o no?
Habitualmente tenemos inconveniente es realizar este trabajo dado que borramos todos los registros involucrados en la duplicidad.

Para solucionar esto y asi poder borrar todos los duplicados salvo 1, debemos seguir algunos pasos.

Por ejemplo, vamos a cerar la tabla DUPLICADOS la cual va a tener 2 columnas:

SQL> create table duplicados (col1 number, col2 varchar2(20))

Hacemos algunos insert en la misma:

SQL> insert into duplicados values (1, 'primero')

SQL> insert into duplicados values (2, 'segundo')

SQL> insert into duplicados values (3, 'tercero')

Provocamos la duplicación de un registro:

SQL> insert into duplicados values (1, 'primero')

SQL> commit;

Bueno, como vemos tenemos un registro duplicado el cual podemos borrar de la siguiente manera:

SQL> delete from duplicados
2 where rowid not in
3 (select min(rowid)
4 from duplicados
5 group by col1, col2);

Para entender un poco lo que acabamos de hacer debemos prestar atención en el min(rowid), el cual de las dos filas duplicadas
solo va a borrar aquella con el menor rowid. Con esto nos aseguramos de borrar solo 1 de los 2 registros.

Para comprobar que ya no tenemos duplicados en la tabla ejecutamos el siguiente SELECT

SQL> select *
2 from duplicados
3 group by col1, col2
4 having count (*) > 1;

Espero les haya servido

Saludos!
Gondalf

17 comentarios:

  1. ¿Podemos tener duplicados en una tabla?

    ResponderEliminar
  2. Claro que si, siempre que no se utilice una PK o algun índice único en alguna/s columna/s.

    Saludos!

    ResponderEliminar
  3. muy util, muchas gracias.

    ResponderEliminar
  4. Gracia men!! Acabas de evitar que me despidan jaja

    ResponderEliminar
  5. Gracias, buenísimo!!!

    ResponderEliminar
  6. Genial idea: simple, sencilla y eficaz. ¡Muchas gracias!

    ResponderEliminar
  7. Excelente muchas gracias!!!

    ResponderEliminar
  8. el problema cuando solo unas columnas son repetidas y otras no, ¿sirve igual esta solucion?,
    quiero decir tienes una tabla con...5 columnas, insertaste sin pk, despues te das cuenta que necesitas una pk compuesta por dos columnas, y no existe unicidad en tu tabla para esas dos columnas, como borras las repetidas?

    ResponderEliminar
  9. Respuestas
    1. Fabio, te borra todos los registros menos las que tienen el mímino Roiwd, da igual si se repite una o 100 veces.

      Eliminar
  10. el ROWID es único para cada fila insertada esto jamas funcionara....

    ResponderEliminar