El problema de los duplicados en las tablas es uno de los más antiguos en SQL, especialmente agravado por el crecimiento masivo de los servicios de Internet y la migración de grandes volúmenes de datos. Al principio, el problema se resolvía manualmente: se encontraban duplicados con scripts puntuales, se eliminaban, pero a medida que crecían los datos, este enfoque se volvía ineficaz.
Problema: con cargas, migraciones o fallos descuidados, a menudo se generan decenas de miles de filas con características clave idénticas (por ejemplo, correo electrónico o pasaporte). Esto conduce a errores en las integraciones, análisis incorrectos y pérdida de confianza por parte de los clientes.
Solución: construir informes sobre duplicados a través de agrupaciones y funciones de ventana; implementar la eliminación de registros duplicados conservando uno "correcto"; agregar restricciones (UNIQUE) para los campos clave y una auditoría regular obligatoria.
Ejemplo de código
WITH Duplicates AS ( SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.* FROM users u JOIN Duplicates d ON u.email = d.email ORDER BY u.email, u.id;
Eliminación de duplicados (dejando la fila con el id mínimo):
DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );
Características clave:
¿Se puede usar DISTINCT para eliminar duplicados de la tabla?
No, DISTINCT solo funciona para selecciones (SELECT), no elimina filas de la tabla. Se debe usar DELETE o INSERT ... SELECT con DISTINCT para crear una nueva tabla limpia.
¿El comando DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) elimina todos los duplicados garantizados?
No, si en la columna clave hay NULL, tal consulta puede dejar duplicados erróneamente debido a las peculiaridades de la comparación de valores NULL.
¿Es suficiente crear un UNIQUE INDEX para que nunca más haya duplicados?
No, el índice solo protegerá contra nuevos intentos de inserción de duplicados, pero no afecta a las repeticiones ya existentes en la tabla.
Un sistema CRM copia usuarios de diversas fuentes sin tener en cuenta la unicidad del correo electrónico, resultando en 50000 duplicados en la base de datos. La adición masiva de un índice UNIQUE provoca un fallo y el servicio se detiene.
Ventajas:
Desventajas:
Un ingeniero analiza regularmente los duplicados a través de informes especializados, limpia la base de datos y crea índices únicos. Antes de migrar nuevos datos, realiza una validación.
Ventajas:
Desventajas: