¿Cómo puedo eliminar las filas duplicadas?
¿Cuál es la mejor manera de eliminar las filas duplicadas de una tabla bastante grande de SQL Server
(es decir, más de 300.000 filas)?
Las filas, por supuesto, no serán duplicados perfectos debido a la existencia del campo de identidad RowID
.
MiTabla
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null
1250
3
Asumiendo que no hay nulos, usted
Grupa por
las columnas únicas, ySelecciona
elMIN (o MAX)
RowId como la fila a mantener. Luego, simplemente borre todo lo que no tenga un ID de fila:En caso de que tenga un GUID en lugar de un entero, puede reemplazar
por
Hay un buen artículo sobre eliminar duplicados en el sitio de soporte de Microsoft. Es bastante conservador - te hacen hacer todo en pasos separados - pero debería funcionar bien contra tablas grandes.
En el pasado he utilizado autouniones para hacer esto, aunque probablemente se podría mejorar con una cláusula HAVING:
Aquí hay otro buen artículo sobre la eliminación de duplicados.
Discute por qué es difícil: "SQL se basa en el álgebra relacional, y los duplicados no pueden ocurrir en el álgebra relacional, porque los duplicados no están permitidos en un conjunto."
La solución de la tabla temporal, y dos ejemplos de mysql.
En el futuro vas a prevenirlo a nivel de base de datos, o desde la perspectiva de la aplicación. Yo sugeriría el nivel de la base de datos porque su base de datos debe ser responsable de mantener la integridad referencial, los desarrolladores sólo causará problemas ;)