En 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 ID y TITULO (campo que contiene valores duplicados) y los siguientes datos de prueba
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 😉
Las lindezas del SQL y el DBA… me da la emoción… por eso me gustan tanto las bases de datos. 😉
Me gustaMe gusta
Muy interesante, gracias¡¡¡
Me gustaMe gusta
A mi esta técnica me devulve error de fuera de memoria…
Me gustaMe gusta
¿Qué volumen de datos que estés moviendo Darío?
Salu2
Me gustaMe gusta
Graciaaaaas!! Funcionó genial! Bendiciones!!
Me gustaMe gusta
No sabes lo que me alegra oírlo.
Me gustaMe gusta
a mi me borro todo lo de la tabla jjaja
Me gustaMe gusta
Limpito, limpito …
¿Tendrías muestra para probar qué pasó?
Me gustaMe gusta
Es que mi tabla esta por defecto, no tiene el campo «ID» y al no colocar esa linea, pues borra todo
Me gustaMe gusta
Uupppssss… como decía mi compañero y mentor: los experimentos en casa y con gaseosa. O, de otro modo: espero lo hayas hecho con datos de prueba y no en «producción» 😉
Me gustaMe gusta
no funciono….
Me gustaMe gusta
¿Se te puede estar escapando algún detalle?
Si quieres le echamos un vistazo…dame un toque a través del soporte técnico.
Me gustaMe gusta
Muy buena opción.. Muchas gracias. Dios te bendiga
Me gustaMe gusta
No sabe lo que me alegra… Agradecerle sus buenos deseos y desearle, igualmente, todo lo mejor
Me gustaMe gusta
buenas tardes,
me podrias explicar que significa el n1 y el n2?
Me gustaMe gusta
Claro, son alias de la tabla.
Me gustaMe gusta
Funciona a la perfeccion. Me salvaste gracias!
Probe eliminando triplicados tambien y funciona
Me gustaMe gusta
Gracias a ti por comentar.
Me alegra que te haya servido y, como bien indicas, funciona independientemente del número de entradas repetidas que existan (siempre que se puedan «agrupar»)
Un saludo Andrés
Me gustaMe gusta
Hola! no sé si aún sigas activo en este sitio pero es que me surge una duda, por qué colocaste el n1 después del delete? que función tiene ahí?
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Hola Pablo, ¿hablamos de BD MySQL? p.e. en SQLite he tenido que modificar levemente la consulta pero, en esencia es igual 🤔
Me gustaMe gusta
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 gustaMe gusta
He estado probando y en PostgreSQL me funciona la solución que utilicé en su día con SQLite
Sinceramente espero que te sea de utilidad, ya contarás 👍
Me gustaMe gusta
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 gustaMe gusta