Published on

July 28, 2020

Estrategias para eliminar registros duplicados en SQL Server

En aplicaciones de almacenamiento de datos durante ETL (Extracción, Transformación y Carga) o incluso en aplicaciones OLTP (Procesamiento de Transacciones en Línea), a menudo se pueden encontrar registros duplicados en las tablas. Para garantizar la consistencia y precisión de los datos, es necesario eliminar estos registros duplicados y mantener solo una instancia de cada registro en la tabla. En este artículo, discutiremos diferentes estrategias que se pueden utilizar para lograr esto, junto con sus ventajas y desventajas.

Usando una subconsulta correlacionada

Si ya tiene una columna de identidad en su tabla, puede usar una subconsulta correlacionada para eliminar duplicados. En este enfoque, la consulta externa se evalúa primero y el resultado se utiliza por la subconsulta interna para su evaluación. El resultado de la subconsulta interna se utiliza luego por la consulta externa para obtener el conjunto de resultados final. El siguiente ejemplo demuestra el uso de una subconsulta correlacionada para eliminar registros duplicados:


-- Seleccionar registros distintos
SELECT * FROM Empleado E1
WHERE E1.ID = (SELECT MAX(ID) FROM Empleado E2
               WHERE E2.Nombre = E1.Nombre AND E1.Apellido = E2.Apellido
               AND E1.Direccion = E2.Direccion)

-- Eliminar duplicados
DELETE Empleado
WHERE ID < (SELECT MAX(ID) FROM Empleado E2
              WHERE E2.Nombre = Empleado.Nombre AND E2.Apellido = Empleado.Apellido
              AND E2.Direccion = Empleado.Direccion)

Usando una tabla temporal

En este enfoque, los registros distintos se extraen de la tabla objetivo en una tabla temporal. Luego, se trunca la tabla objetivo y se insertan los registros de la tabla temporal de nuevo en la tabla objetivo. Este método requiere suficiente espacio en la base de datos tempdb para contener todos los registros distintos. También se recomienda realizar esta operación dentro de una transacción para garantizar la integridad de los datos. El siguiente ejemplo demuestra el uso de una tabla temporal para eliminar duplicados:


-- Extraer registros distintos en la tabla temporal
SELECT DISTINCT * INTO #Empleado
FROM Empleado

-- Truncar la tabla objetivo
TRUNCATE TABLE Empleado

-- Insertar los registros distintos de la tabla temporal de nuevo en la tabla objetivo
INSERT INTO Empleado SELECT * FROM #Empleado

-- Eliminar la tabla temporal
IF OBJECT_ID('tempdb..#Empleado') IS NOT NULL
  DROP TABLE #Empleado

Crear una nueva tabla con registros distintos y renombrarla

En este enfoque, se crea una nueva tabla con todos los registros distintos. Se elimina la tabla objetivo existente y se renombra la tabla recién creada con el nombre original de la tabla objetivo. Es importante asegurarse de que haya suficiente espacio en el grupo de archivos predeterminado para contener todos los registros distintos. Este método también puede afectar los metadatos de la tabla objetivo, como el ID del objeto y la fecha de creación. El siguiente ejemplo demuestra la creación de una nueva tabla con registros distintos:


-- Extraer registros distintos en una nueva tabla
SELECT DISTINCT * INTO EmpleadoNuevo
FROM Empleado

-- Eliminar la antigua tabla objetivo
DROP TABLE Empleado

-- Renombrar la nueva tabla
EXEC sp_rename 'EmpleadoNuevo', 'Empleado'

Usando Expresiones de Tabla Común (CTE)

SQL Server 2005 introdujo las Expresiones de Tabla Común (CTE), que actúan como un conjunto de resultados temporales definido dentro del ámbito de ejecución de una sola instrucción SELECT, INSERT, UPDATE, DELETE o CREATE VIEW. En este enfoque, se utiliza una CTE para la deduplicación. La función ROW_NUMBER se utiliza para asignar un número secuencial a cada fila dentro de una partición del conjunto de resultados. Luego, se eliminan los registros duplicados, manteniendo solo un registro de cada grupo. Este método es eficiente y se recomienda para SQL Server 2005 o versiones posteriores. El siguiente ejemplo demuestra el uso de una CTE para la deduplicación:


-- Ejemplo 1
WITH CTE AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY [Nombre], [Apellido], [Direccion] ORDER BY [Nombre] DESC, [Apellido] DESC, [Direccion] DESC) AS NumeroFila
FROM Empleado tbl
WHERE EXISTS (SELECT TOP 1 1 FROM (SELECT Nombre, Apellido, Direccion FROM Empleado GROUP BY [Nombre], [Apellido], [Direccion] HAVING COUNT(*) > 1) TablaGrupo
              WHERE TablaGrupo.Nombre = tbl.Nombre AND TablaGrupo.Apellido = tbl.Apellido AND TablaGrupo.Direccion = tbl.Direccion)
)
DELETE FROM CTE WHERE NumeroFila > 1

-- Un ejemplo más simplificado y rápido
WITH CTE AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY [Nombre], [Apellido], [Direccion] ORDER BY [Nombre] DESC, [Apellido] DESC, [Direccion] DESC) AS NumeroFila,
       [Nombre], [Apellido], [Direccion]
FROM Empleado tbl
)
DELETE FROM CTE WHERE NumeroFila > 1

Usando la Transformación de Agrupación Difusa en SSIS

Si está utilizando SQL Server Integration Services (SSIS) para cargar datos en su tabla objetivo, puede utilizar la Transformación de Agrupación Difusa (Fuzzy Grouping Transformation) para ignorar registros duplicados e insertar solo registros únicos. La Transformación de Agrupación Difusa agrupa registros similares en función de columnas especificadas y le permite enrutar filas únicas a la tabla de destino mientras ignora registros duplicados. Esto se puede lograr agregando una división condicional después de la Transformación de Agrupación Difusa. El siguiente ejemplo demuestra el uso de la Transformación de Agrupación Difusa en SSIS:

(Imagen de un paquete SSIS con la Transformación de Agrupación Difusa)

Usando la instrucción MERGE

A partir de SQL Server 2008, se puede utilizar la instrucción MERGE para realizar operaciones de INSERT, UPDATE y DELETE en una sola instrucción. Este comando permite a los desarrolladores manejar escenarios comunes de almacenamiento de datos de manera más efectiva, como verificar si existe una fila y luego ejecutar una operación de inserción, actualización o eliminación en consecuencia. La instrucción MERGE fusiona datos de un conjunto de resultados fuente a una tabla objetivo en función de una condición especificada. Se asegura de que no se inserten registros duplicados en la tabla objetivo y actualiza los registros existentes si es necesario. El siguiente ejemplo demuestra el uso de la instrucción MERGE:

(Ejemplo de la instrucción MERGE)

Estas son algunas de las estrategias que se pueden emplear para eliminar registros duplicados de una tabla en SQL Server. Cada método tiene sus propias ventajas y consideraciones, por lo que es importante elegir el enfoque más adecuado según los requisitos específicos de su aplicación.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.