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.