Tip de MSSQLTips para eliminar filas duplicadas en una tabla sin clave primaria, utilizando SET ROWCOUNT para limitar el número de filas afectadas por una consulta:
SELECT * FROM dbo.duplicateTest; SET ROWCOUNT 1; DELETE FROM dbo.duplicateTest WHERE ID = 1; SET ROWCOUNT 0;
Otra propuesta más clásica sacada de un grupo de Linkedin (cuidado si la tabla es grande):
DELETE FROM TestTable WHERE EXISTS (SELECT Sid FROM TestTable T WHERE T.Tname = TestTable.Tname AND I.SId < TestTable.SId)
- Versión para impresión
- Inicie sesión para enviar comentarios
Hola Creo que es más
Subido por Anonimo (no verificado) el 16 Noviembre, 2014 - 15:47
Hola
Creo que es más escalable la opcion de Pinal Dave (entre otros) con un bloque CTE.
La pk yo aconsejaría crearla para el borrado, seria mas robusto.
Suponiendo dicha tabla y un collate CI:
Muy útil para eliminar registros duplicados en tablas de grand volúmen y dentro de un WHILE con EXISTS y TOP en el CTE evitamos bloqueos, dura menos el lock table y reducimos el uso de transaccional y tempdb.
A partir de SQL Server 2005, eso si.
Muy buena solución para
Subido por Carlos el 20 Noviembre, 2014 - 09:20
En respuesta a Hola Creo que es más por Anonimo (no verificado)
Muy buena solución para eliminar duplicados, gracias por compartirla.
Además acabo de encontrar este aviso en la documentación de SQLServer sobre SET ROWCOUNT:
Eso significa que el truco de utilizar el SET ROWCOUNT 1 en el DELETE dentro de poco ya no funcionará, así que mejor nos acostumbramos a hacerlo de otra manera, como con este bloque CTE (Expresión de Tabla Común) o, para decirlo de manera mas llana, 'utilizando un ;with'