Cómo Eliminar Fácilmente Filas Duplicadas de una Tabla de SQL Server

Limpiar tu base de datos es esencial para mantener la calidad de los datos, especialmente cuando se trata de filas duplicadas. Si estás trabajando con una tabla de SQL Server grande—por ejemplo, con más de 300,000 filas—podrías encontrar duplicados que te gustaría eliminar. En esta publicación del blog, te guiaremos a través de un proceso simple para eliminar eficazmente los duplicados mientras mantienes los datos relevantes intactos.

Entendiendo el Problema

Cuando tienes una tabla como MyTable, que incluye una clave primaria con un campo de identidad (RowID), los duplicados no aparecen como coincidencias perfectas. En su lugar, pueden variar en una o más columnas que no son clave, como Col1, Col2 y Col3. Es esencial identificar estos duplicados de manera inteligente para evitar la pérdida de datos mientras se asegura la integridad de tu tabla.

Ejemplo de Estructura de MyTable

RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

La Solución Explicada

Para eliminar efectivamente las filas duplicadas mientras mantienes la relevante, puedes utilizar las declaraciones GROUP BY y los comandos DELETE de SQL Server. A continuación se presentan los pasos desglosados para mayor claridad.

Guía Paso a Paso

1. Agrupando y Seleccionando Filas Únicas

El primer paso es agrupar las filas por las columnas que deseas verificar en busca de duplicados. En este caso, Col1, Col2 y Col3. Utilizarás la función MIN para encontrar el RowID más pequeño para cada grupo de duplicados, lo que te guiará sobre qué fila mantener.

Aquí tienes cómo podría verse el código SQL:

SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
FROM MyTable 
GROUP BY Col1, Col2, Col3

2. Eliminar Duplicados

Una vez que hayas identificado qué filas mantener, el siguiente paso es eliminar todo lo que no tenga un equivalente en tu nuevo conjunto KeepRows. Aquí está el código SQL para realizar la eliminación:

DELETE FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL

Este comando realiza lo siguiente:

  • Realiza un LEFT OUTER JOIN entre MyTable y el conjunto calculado KeepRows.
  • Cualquier fila en MyTable que no coincida con un RowId en KeepRows se elimina.

Manejo de Identificadores Únicos

Si tu tabla incluye un GUID en lugar de un entero para la identificación de filas, simplemente ajusta tu selección de MIN. Reemplaza:

MIN(RowId)

Con:

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))

Esto asegura que estás identificando correctamente el mínimo GUID mientras mantienes la integridad del tipo de datos.

Conclusión

Eliminar filas duplicadas de SQL Server se puede realizar de manera eficiente utilizando GROUP BY y sus técnicas asociadas de uniones y eliminación. Al seguir estos pasos, puedes mantener una base de datos limpia y funcional sin arriesgar la pérdida de datos importantes. ¡Siempre recuerda hacer una copia de seguridad de tu base de datos antes de realizar eliminaciones masivas para mayor seguridad!

Con el conocimiento que has adquirido aquí, puedes enfrentar con confianza el problema de los duplicados en tus tablas SQL. ¡Feliz consulta!