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.