jueves, 19 de mayo de 2011

Borrar Registros Duplicados (dejando sólo los registros válidos)

Buen dia amigos,

Les traigo un script utilísimo si han tenido la mala suerte de, involuntariamente, duplicar, triplicar, cuadruplicar etc registros de una tabla...
Con la ayuda de mi script en unas pocas línes de código podrán volver la tabla a su estado anterior, es decir, podrá eliminar sólo los registros duplicados, conservando los registros válidos. Manos a la obra..

--------------------------------------------------------------
-- Detalle: Este script permite borrar registros duplicados --
-- Autor: Gustavo Herrera --
--------------------------------------------------------------

-- 1) Agrego un campo "id" identity (si no lo tiene)
Alter Table TablaX
add id integer identity

-- 2) Borro registros duplicados
Delete from TablaX
where Id > (Select min(Id) From TablaX as b Where TablaX.Idmsg = b.Idmsg)

-- 3) Dropeo el campo creado para correr el paso 2
Alter Table TablaX
Drop Column id

26 comentarios:

  1. Hola Gustavo!

    Qué es Idmsg?

    Gracias!!

    ResponderEliminar
  2. Es el id que identifica el producto, empleado, servicio de cada uno de los registros de tabla. GUSTAVO.

    ResponderEliminar
  3. Muchas gracias... sirvío perfectamente para SQL Server 2000 ya que marcaba errores con Row_Number() débido a que esta función se implementó en SQL Server 2005...tambíen las comas me daba error ... y así es como me funciono:::

    Primer Paso Igual ...

    Delete from historial
    WHERE Id >
    (SELECT MIN(Id)
    FROM historial AS b
    WHERE historial.claveU = b.claveU AND historial.claveS = b.claveS )

    siguiente paso igual....


    GRACIAS por compartir tu conocimiento.!!!! un abrazo

    ResponderEliminar
  4. EXCELENTE DE VERDAD MUY SIMPLE Y EFECTIVO GRACIAS!!!!!!

    ResponderEliminar
  5. Gustavo! Muchas gracias, me has evitado unas cuantas horas de trabajo.

    ResponderEliminar
  6. pero si en los registros duplicados tienes un valor que quieres que se agregen al campo original como le haces para que se sumen???

    ResponderEliminar
  7. Perfectoo ... me salvo esto...

    ResponderEliminar
  8. buenisimoo me salvaste la vida xd

    ResponderEliminar
  9. Muchas Gracias Gustavo por compartir este query.
    Me ayudo mucho lo trabaje en una tabla de 293k registros y dio de baja 9.3k repetidos Suerte a Argentina en el Mundial de Brasil y ARRIBA los PUMAS!!
    desde Mèxico Saludos.Gabriel Del Real Monterrey Mexico.

    ResponderEliminar
  10. Gustavo, disculpa la molestia, pero en mi caso tengo una tabla con 2 columnas únicamente, por una migración errónea se duplicaron los registros, yo debería eliminar aquellas filas que sean exactamente iguales. Te paso el ejemplo de mi tabla:
    sa_art1 sa_art2
    MCR09-003 COS725
    MCR09-003 MTA243
    MCR09-003 VAL1469
    MCR09-003 COS725
    MCR09-003 MTA243
    MCR09-003 VAL1469

    En este caso debería borrar una de cada, para que queden 3 únicos registros. como seria el script. desde ya muchas gracias, y disculpa las molestias. Saludos.

    ResponderEliminar
  11. Va la respuesta con el script
    --1) AGREGAS UN CAMPO INCREMENTAL A TU TABLA

    ALTER TABLE tabla
    ADD Id_BORRADO INT IDENTITY (1,1)


    -- 2) Borro registros duplicados
    Delete from tabla
    where Id_BORRADO > (Select min(Id_BORRADO) From tabla as b Where tabla.sa_art1 = b.sa_art1 and tabla.sa_art2 = b.sa_art2)

    -- 3) Dropeo el campo creado para correr el paso 2
    Alter Tabletabla
    Drop Column Id_BORRADO

    ResponderEliminar
  12. Muy buen query! Excelente solución!

    ResponderEliminar
  13. La letra b a que se refiere, disculpa..no lo entendi

    ResponderEliminar
  14. Tengo años que no trabajo con sql, hoy tuve la necesidad de hacer algo asi, ni me acordaba de los comandos de sql, pero tu ayuda fue excelente. muchas gracias.

    ResponderEliminar
  15. Infracción de la restricción PRIMARY KEY 'XPKDistrito'. No se puede insertar una clave duplicada en el objeto 'dbo.Distrito'.
    Se terminó la instrucción.

    ResponderEliminar
  16. Yo lo hago de esta manera:
    1. Hago una copia de la tabla en una tabla temporal
    create table #tablaAux(/*Todos los campos de tablaX*/)
    insert into #tablaAux select * from tablaX
    2. Vacío tablaX
    truncate table tablaX
    3. LLeno tablaX sin duplicados
    insert into tablaX select distinct * from #tablaAux
    4. Limpio tabla temporal
    drop table #tablaAux

    ResponderEliminar
  17. Por favor como realizo la consulta para borrar los registros repetidos

    Textos completos ficha id_material cantidad observacion
    Editar Borrar 1 1 12 NULL
    Editar Borrar 2 2 1 NULL
    Editar Borrar 12345 1 45
    Editar Borrar 12344 2 55 bien
    Editar Borrar 3333 1 4
    Editar Borrar 12121 1 12
    Editar Borrar 2333 1 3
    Editar Borrar 45456 2 44
    Editar Borrar 5678 1 12
    Editar Borrar 5678 2 12 ok
    Editar Borrar 55 1 55
    Editar Borrar 12344444 2 2 Carta
    Editar Borrar 12344444 1 5 Amarillo y Azul
    Editar Borrar 12398 1 3

    ResponderEliminar
  18. ficha id_material cantidad observacion
    1 1 12 NULL
    12344444 2 2 Carta
    12344444 1 5 Amarillo y Azul

    ResponderEliminar
  19. ficha id_material cantidad observacion
    1 1 12 NULL
    12344444 2 2 Carta
    12344444 1 5 Amarillo y Azul

    ResponderEliminar
  20. Por favor como realizo la consulta para borrar los registros repetidos

    Textos completos ficha id_material cantidad observacion
    Editar Borrar 1 1 12 NULL
    Editar Borrar 2 2 1 NULL
    Editar Borrar 12345 1 45
    Editar Borrar 12344 2 55 bien
    Editar Borrar 3333 1 4
    Editar Borrar 12121 1 12
    Editar Borrar 2333 1 3
    Editar Borrar 45456 2 44
    Editar Borrar 5678 1 12
    Editar Borrar 5678 2 12 ok
    Editar Borrar 55 1 55
    Editar Borrar 12344444 2 2 Carta
    Editar Borrar 12344444 1 5 Amarillo y Azul
    Editar Borrar 12398 1 3

    ResponderEliminar
    Respuestas
    1. de la misma forma que lo hace aca, solo que en la condición tienes que comparar los campos que tomarás para evaluar si esta repetido o no un registro,en tu caso deberias comparar "textos completos,ficha,id_material,cantidad,observacion"

      Eliminar
  21. Tengo yo una tabla en SQL Server la cual tiene dos llaves , como se podria aplicar la solucion para eliminar registros duplicados, gracias.. de antemano

    ResponderEliminar
  22. Tengo yo una tabla en SQL Server la cual tiene dos llaves , como se podria aplicar la solucion para eliminar registros duplicados, gracias.. de antemano

    ResponderEliminar