Eliminar registros duplicados en SQL

Hay ocasiones en que se necesitan eliminar duplicados de nuestras tablas en la base de datos, un método sencillo para ubicarlos puede ser por ejemplo este query:

SELECT isourceid, isourcekind, iresourceId, COUNT(*) as repeticiones
INTO tabtemp
FROM relSRight
GROUP BY isourceid, isourcekind, iresourceId
HAVING COUNT(*) > 1

Con este query insertamos en una tabla temporal (tabtemp) los registros que están duplicados y la cantidad de repeticiones del mismo.

Ahora, lo que haremos es un cursor que irá analizando registro a registro de nuestra tabla temporal y eliminará los registros duplicados para cada conjunto, pero siempre dejando al menos un registro, es decir, si se encuentran 2 repeticiones de un registro borrará solamente una, si se encuentran 4 repeticiones del mismo borrará 3, y así sucesivamente.

DECLARE @isourceid int, @isourcekind int,@iresourceId int, @repeticiones int;
DECLARE @sqlexec varchar(200)
DECLARE dup_cursor
CURSOR FOR
SELECT isourceid, isourcekind, iresourceId, repeticiones
FROM tabtemp
OPEN dup_cursor;
FETCH NEXT FROM dup_cursor INTO @isourceid, @isourcekind, @iresourceId, @repeticiones;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlexec = ‘ set rowcount ‘ + CAST( (@repeticiones – 1) AS VARCHAR(3)) +
‘ delete from relSright where isourceid = ‘ + CAST(  @isourceid AS VARCHAR(10)) +
‘ and isourcekind = ‘ + CAST(  @isourcekind  AS VARCHAR(10)) +
‘ and iresourceId = ‘ +  CAST(@iresourceId AS VARCHAR(10))
EXEC(@sqlexec)
FETCH NEXT FROM dup_cursor INTO @isourceid, @isourcekind, @iresourceId, @repeticiones;
END
CLOSE dup_cursor;
DEALLOCATE dup_cursor;

 

Y con esto tenemos eliminados todas las repeticiones de nuestros registros en una tabla.

 

Espero sea de ayuda.

 

Saludos.


7 comments

  1. Que tal Tom, la necesidad de hacer este procedimiento es para borrar registros que esten duplicados en una tabla y dejar al menos uno restante en la misma, es decir, si tienes 5 repeticiones de un registro en una tabla con un distinct (como tu sugieres) regresas un valor, y en efecto es correcto, pero los registros duplicados permanecen en la tabla, y eso especificamente no es correcto cuando deseas tener una consistencia de datos en tablas que contienen miles de registros.
    saludos

  2. tengo un inconveniente…el resto del codigo esta muy bueno, pero en la parte del FECTH, la palabra clave NEXT no se me marca en color azul para indicar q es palabra clave de SQL, yo utilizo sql server 2005, que tengo que hacer.?…ese es unico error qe tengo con el codigo que espusieon gravias

  3. Pero con distinct lo pasas a una tabla temporal, eliminas el contenido de la tabla y pasas los datos…sin tanto problemas.

  4. Efectivamente German, este tipo de ejercicio funciona cuando tus tablas son pequenas y sin ningun tipo de dependencias o relaciones, desafortunadamente en mi ambiente productivo tenia millones de registros con tablas que estan ligadas a varios procesos, incluidos SSIS y algunos jobs, por lo tanto la opcion de borrar la tabla y volverla a generar no es la solucion apropiada.@German

Leave a Reply

Your email address will not be published.

Para evitar SPAM realiza la siguiente operación: *