Detectar registros duplicados por una clave de negocio

Una carga contiene clientes con correos repetidos, o una tabla permite guardar varias filas que representan el mismo dato funcional. La llave primaria distingue cada registro, pero no responde si el negocio los considera equivalentes.

Qué necesitamos distinguir

Una clave de negocio identifica una entidad mediante datos del dominio, como el correo, y no solo mediante un identificador interno. Normalizar significa transformar representaciones distintas a una forma común antes de compararlas.

Primero definiremos la clave de negocio. En este ejemplo dos filas son candidatas a duplicado cuando su correo coincide después de retirar espacios laterales y normalizar mayúsculas. Los correos nulos o vacíos se excluyen: compartir la ausencia de un dato no demuestra que dos clientes sean la misma persona.

Consulta

/*
    Antes de ejecutar:
        Revisa la base activa, los nombres de objetos, los parámetros y los permisos.
        Adapta el ejemplo a tu modelo y pruébalo primero en un ambiente controlado.
*/

SET NOCOUNT ON;
GO
-- Consulta
WITH ClientesNormalizados AS
(
    SELECT
        ci.IdClienteImportado,
        ci.Nombre,
        ci.Correo,
        LOWER(NULLIF(TRIM(ci.Correo), N'')) AS CorreoNormalizado
    FROM dbo.ClienteImportado AS ci
),
ClavesDuplicadas AS
(
    SELECT
        cn.CorreoNormalizado,
        COUNT_BIG(*) AS Cantidad
    FROM ClientesNormalizados AS cn
    WHERE cn.CorreoNormalizado IS NOT NULL
    GROUP BY cn.CorreoNormalizado
    HAVING COUNT_BIG(*) > 1
)
SELECT
    cn.IdClienteImportado,
    cn.Nombre,
    cn.Correo,
    cn.CorreoNormalizado,
    cd.Cantidad AS FilasConLaMismaClave
FROM ClientesNormalizados AS cn
INNER JOIN ClavesDuplicadas AS cd
    ON cd.CorreoNormalizado = cn.CorreoNormalizado
ORDER BY
    cn.CorreoNormalizado,
    cn.IdClienteImportado;
GO

Parámetros o permisos

Sustituye Correo por la columna o combinación que realmente identifica una entidad en tu sistema. Una clave de negocio podría ser un número de cliente, una referencia externa o varias columnas, no necesariamente un correo. La normalización también forma parte de la regla. TRIM ignora espacios laterales y LOWER hace visible la intención de comparar sin diferencias de mayúsculas; la intercalación de la columna puede hacer que esta última transformación sea redundante. No retires acentos, signos o caracteres sin confirmar que el negocio los considera equivalentes. La consulta solo requiere permiso de lectura sobre la tabla.

Cómo leer el resultado

Cada fila conserva su identificador original y muestra la clave utilizada para agruparla. FilasConLaMismaClave indica el tamaño del grupo repetido. Si un correo aparece tres veces, veremos las tres filas con el valor 3. La primera CTE prepara los datos; la segunda conserva únicamente las claves con más de una aparición. La consulta final vuelve al detalle para que podamos comparar nombres, fechas u otras columnas antes de decidir qué ocurrió. Si solo necesitas una lista resumida, ejecuta la segunda CTE como consulta final y selecciona CorreoNormalizado y Cantidad.

Qué conclusión sí permite obtener

Permite localizar grupos repetidos bajo una definición explícita y medir cuántas filas participan en cada uno.

Qué conclusión todavía no permite obtener

Una comparación difusa mide semejanza aproximada en lugar de igualdad exacta; necesita reglas y umbrales propios del dato.

No demuestra que dos filas representen a la misma persona ni decide cuál debe conservarse. Un correo compartido puede ser válido; dos correos diferentes también podrían pertenecer a un mismo cliente. Tampoco descubre duplicados aproximados por errores ortográficos. Ese problema necesita reglas de calidad o comparación difusa adicionales.

Siguiente comprobación razonable

Revisa las columnas que describen origen, fecha y actividad de cada fila. Después confirma la regla con quien conoce el dato y comprueba qué tablas referencian los identificadores antes de fusionar o eliminar registros.

Índice del recorrido

Desarrollo y exploración

22 artículos de Desarrollo y exploración
  1. 01Buscar una tabla o vista por nombre
  2. 02Buscar una columna en toda la base
  3. 03Buscar texto dentro de procedimientos, vistas y funciones
  4. 04Consultar dependencias de un objeto
  5. 05Listar relaciones y llaves foráneas
  6. 06Consultar llaves primarias, restricciones únicas e índices
  7. 07Listar columnas con tipo, longitud, nulabilidad y valor predeterminado
  8. 08Encontrar triggers y sus tablas asociadas
  9. 09Encontrar objetos modificados recientemente
  10. 10Obtener conteos aproximados de todas las tablas
  11. 11Medir el espacio utilizado por cada tabla
  12. 12Revisar columnas IDENTITY y su valor actual
  13. 13Detectar registros duplicados por una clave de negocio
  14. 14Detectar registros huérfanos
  15. 15Comparar dos conjuntos de datos
  16. 16Validar conversiones antes de modificar una columna
  17. 17Ejecutar un UPDATE con validación y reversión controlada
  18. 18Ejecutar un DELETE con respaldo lógico y reversión controlada
  19. 19Comparar la estructura de dos bases de datos
  20. 20Describir el resultado de una consulta o procedimiento
  21. 21Encontrar tablas sin llave primaria
  22. 22Buscar un valor en columnas seleccionadas