[SQL] Eliminar entradas duplicadas dejando una de muestra


limpiar contenido base de datosEn un proyecto con WordPress como CMS y MySQL como base de datos en el que he estado trabajando se me planteó la necesidad de eliminar los post duplicados fruto de las distintas pruebas pero dejando uno de ellos de modo que no se perdiera todo el trabajo realizado (y evitar tener que volver a cargar la BD con datos de prueba 😉 )

Para aquellos que necesiten eliminar las filas repetidas de una base de datos les dejo un par de sentencias SQL con la solución adoptada.


Sea la tabla PRUEBA con las columnas IDTITULO (campo que contiene valores duplicados) y los siguientes datos de prueba

insertar datos prueba en mysql

en los que se observan títulos duplicados a eliminar

Dejar la entrada más antigua

Si queremos eliminar todas las entradas duplicadas dejando la primera aparición (la más vieja, la que tiene menor ID) lanzaremos la siguiente sentencia SQL

DELETE n1
FROM prueba n1, prueba n2
WHERE n1.titulo = n2.titulo
AND n1.id > n2.id;

Si quieres probar la consulta SQL aquí puedes hacerlo (gracias SqlFiddle).

Dejar la última aparición

Si queremos eliminar todas las entradas duplicadas menos la más reciente (la más nueva, la que tiene mayor ID) lanzaremos la siguiente consulta SQL

DELETE n1
FROM prueba n1, prueba n2
WHERE n1.titulo = n2.titulo
AND n1.id < n2.id;

NOTA: Observa que el único cambio ha sido n1.id < n2.id en lugar de n1.id > n2.id

Puedes probar aquí la solución.

Conclusión

Pequeña chuleta para cuando se necesita eliminar todas las entradas repetidas en una tabla de la base de datos dejando alguna de las filas repetidas como muestra.

Espero que os sea de utilidad si os veis en la necesidad 😉

26 comentarios en “[SQL] Eliminar entradas duplicadas dejando una de muestra

    1. Hola David, uso el alias de la tabla de la que quiero borrar la fila.
      Observa que en el from se usa la misma tabla con dos alias distintos (n1 y n2), ¿cuál debe borrarse?
      De ahí que especifique cuál usar exactamente
      Espero haberte podido ayudar 👍

      Me gusta

  1. Hola estoy probando el Script de SQL del ejemplo
    «DELETE n1
    FROM prueba n1, prueba n2
    WHERE n1.titulo = n2.titulo
    AND n1.id < n2.id;»
    Pero me tira error el n1 después del DELETE no le gusta…
    Saludos

    Me gusta

      1. Hola buen día
        Sabe que tiene razón. Me equivoque yo lo estaba probando en PostgreSQL, por eso me da error en la línea «DELETE n1…».
        La verda no sé como resolverlo en Postgre.
        Ya he probado varias cosas y no logro; de los registros duplicados que tengo; eliminar solo uno de los dos.
        Saludos y gracias

        Me gusta

    1. Buen día
      Gracias por la respuesta.
      La única forma que encontré de eliminar; en casos de registros duplicados y dejar solo uno; es esta:

      delete from hlcabece
      where hlcaNROINT in(
      select HLCANROINT from(
      select HLCANROINT, ROW_NUMBER() over (PARTITION BY hlcacuitol order by hlcacuitol) as reg, hlcacuitol from hlcabece) T
      where T.reg > 1);

      Pero hay un inconveniente (bah!… no sé si es así). La cantidad total de registros duplicados er de 78 o sea que deben quedar la mitad 39. Al ejecutar el Script SQL para hacer el «Delete» cuando finalizaba me decía que se habían eliminado «40», y me entró la duda … Pero hice un «Select» y efectivamente eliminó 39. :/
      (Por supuesto estas pruevas las hice en Test y cuando estuve seguro lo ejecuté en producción.)

      Saludos

      Me gusta

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.