Eliminación de filas duplicadas de una tabla de SQL Server mediante un script
En este artículo se proporciona un script que puede usar para quitar filas duplicadas de una tabla de Microsoft SQL Server.
Versión del producto original: SQL Server
Número de KB original: 70956
Resumen
Hay dos métodos frecuentes que puede usar para eliminar registros duplicados de una tabla de SQL Server. Para la demostración, empiece por crear una tabla y datos de ejemplo:
CREATE TABLE original_table (key_value int )
INSERT INTO original_table values (1)
INSERT INTO original_table values (1)
INSERT INTO original_table values (1)
INSERT INTO original_table values (2)
INSERT INTO original_table values (2)
INSERT INTO original_table values (2)
INSERT INTO original_table values (2)
A continuación, pruebe los métodos siguientes para quitar las filas duplicadas de la tabla.
Método 1
Ejecute el siguiente script:
SELECT DISTINCT *
INTO duplicate_table
FROM original_table
GROUP BY key_value
HAVING COUNT(key_value) > 1
DELETE original_table
WHERE key_value
IN (SELECT key_value
FROM duplicate_table)
INSERT original_table
SELECT *
FROM duplicate_table
DROP TABLE duplicate_table
El script lleva a cabo las siguientes acciones en el orden que se especifica:
- Mueve una instancia de cualquier fila duplicada de la tabla original a una tabla duplicada.
- Elimina todas las filas de la tabla original que también se encuentran en la tabla duplicada.
- Mueve las filas de la tabla duplicada a la tabla original.
- Elimina la tabla duplicada.
Este método es sencillo. Sin embargo, requiere que tenga suficiente espacio disponible en la base de datos para crear temporalmente la tabla duplicada. Este método también genera sobrecarga porque se mueven los datos.
Además, si la tabla tiene una columna IDENTITY, tendría que usar SET IDENTITY_INSERT ON al restaurar los datos en la tabla original.
Método 2
La función ROW_NUMBER que se introdujo en Microsoft SQL Server 2005 hace que esta operación sea mucho más sencilla:
DELETE T
FROM
(
SELECT *
, DupRank = ROW_NUMBER() OVER (
PARTITION BY key_value
ORDER BY (SELECT NULL)
)
FROM original_table
) AS T
WHERE DupRank > 1
El script lleva a cabo las siguientes acciones en el orden que se especifica:
- Usa la función
ROW_NUMBER
para particionar los datos en función delkey_value
, que puede ser una o varias columnas separadas por comas. - Elimina todos los registros que recibieron un valor
DupRank
mayor que 1. Este valor especifica que los registros son duplicados.
Debido a la (SELECT NULL)
expresión, el script no ordena los datos particionados en función de ninguna condición. Si la lógica para eliminar duplicados requiere elegir qué registros eliminar y cuáles mantener en función del criterio de ordenación de otras columnas, puede usar la ORDER BY
expresión para hacerlo.
Más información
El método 2 es sencillo y eficaz por estas razones:
- No requiere que copie temporalmente los registros duplicados en otra tabla.
- No requiere que una tabla original se una a sí misma (por ejemplo, mediante una subconsulta que devuelva todos los registros duplicados mediante una combinación de
GROUP BY
yHAVING
). - Para obtener el mejor rendimiento, debe tener un índice correspondiente en la tabla que usa
key_value
como clave de índice e incluye las columnas de ordenación que pueda haber usado en laORDER BY
expresión.
Sin embargo, este método no funciona en versiones obsoletas de SQL Server que no admiten la función ROW_NUMBER. En esta situación, debe usar el método 1 o algún método similar en su lugar.