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 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 del key_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 con particiones en función de ninguna condición. Si la lógica para eliminar duplicados requiere elegir qué registros eliminar y qué mantener en función del orden 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 es necesario copiar temporalmente los registros duplicados en otra tabla.
  • No es necesario combinar la tabla original con sí misma (por ejemplo, mediante una subconsulta que devuelve todos los registros duplicados mediante una combinación de GROUP BY y HAVING).
  • Para obtener el mejor rendimiento, debe tener un índice correspondiente en la tabla que use key_value como clave de índice e incluya las columnas de ordenación que haya usado en la ORDER 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.