Detectar registros huérfanos

Una carga contiene pedidos cuyo cliente no aparece en el catálogo recibido. También puede ocurrir en una base sin llaves foráneas, después de una migración incompleta o cuando la relación se valida únicamente en la aplicación.

Qué necesitamos distinguir

La tabla hija contiene la referencia y la tabla padre contiene la fila esperada. Una referencia huérfana conserva una clave hija con valor, pero no encuentra la fila padre correspondiente.

Buscaremos claves hijas no nulas que no tengan una fila padre correspondiente. Una clave nula expresa ausencia de relación; una clave con valor pero sin coincidencia expresa una referencia huérfana. Conviene medirlas por separado.

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
-- Registros con referencia inexistente
SELECT
    pi.IdPedidoImportado,
    pi.IdClienteOrigen,
    pi.FechaPedido,
    pi.Total
FROM dbo.PedidoImportado AS pi
WHERE pi.IdClienteOrigen IS NOT NULL
  AND NOT EXISTS
  (
      SELECT 1
      FROM dbo.ClienteImportado AS ci
      WHERE ci.IdClienteOrigen = pi.IdClienteOrigen
  )
ORDER BY
    pi.IdClienteOrigen,
    pi.IdPedidoImportado;
GO

-- Variante con LEFT JOIN
SELECT
    pi.IdPedidoImportado,
    pi.IdClienteOrigen,
    pi.FechaPedido,
    pi.Total
FROM dbo.PedidoImportado AS pi
LEFT JOIN dbo.ClienteImportado AS ci
    ON ci.IdClienteOrigen = pi.IdClienteOrigen
WHERE pi.IdClienteOrigen IS NOT NULL
  AND ci.IdClienteImportado IS NULL;
GO

-- Registros sin clave de referencia
SELECT COUNT_BIG(*) AS PedidosSinClaveDeCliente
FROM dbo.PedidoImportado
WHERE IdClienteOrigen IS NULL;
GO

Parámetros o permisos

Una llave foránea es una restricción que exige que la referencia apunte a una fila válida; esta comprobación también sirve cuando la relación no está declarada.

Cambia las tablas y columnas por la relación que quieres comprobar. La columna evaluada del padre debe ser no nula o estar respaldada por una regla que permita reconocer la falta de coincidencia. En la variante con LEFT JOIN usamos la llave primaria IdClienteImportado para esa comprobación. Ambas consultas requieren lectura sobre las dos tablas. En conjuntos grandes, revisa que las columnas de relación tengan índices adecuados antes de ejecutar una búsqueda amplia.

Cómo leer el resultado

Cada fila es un pedido con un identificador de cliente informado, pero sin cliente coincidente. NOT EXISTS expresa directamente esa ausencia y evita multiplicar resultados si la fuente padre contiene claves repetidas. La variante con LEFT JOIN es útil cuando también necesitamos mostrar columnas del padre durante otras validaciones. Si la tabla padre tiene varias filas para una clave, una unión puede duplicar el detalle; NOT EXISTS solo responde si existe al menos una. Para medir valores hijos nulos sin mezclarlos con huérfanos, utiliza otra consulta: SELECT COUNT_BIG(*) AS PedidosSinClaveDeCliente FROM dbo.PedidoImportado WHERE IdClienteOrigen IS NULL;

Qué conclusión sí permite obtener

Permite identificar referencias no nulas que no encuentran padre bajo la relación consultada.

Qué conclusión todavía no permite obtener

No explica por qué falta el padre ni determina que el hijo deba eliminarse. La carga del catálogo podría estar incompleta, el identificador podría requerir conversión o la relación podría pertenecer a otro sistema. Una llave foránea declarada impediría normalmente estos casos, pero no sustituye la revisión de datos importados o relaciones construidas fuera de la base.

Siguiente comprobación razonable

Compara el origen y la fecha de carga de ambos conjuntos. Revisa si las claves necesitan normalización y confirma si existe una llave foránea, un proceso de borrado suave o una tabla de equivalencias antes de corregir los datos.

Í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