¿Cómo puedo obtener todos los registros huérfanos en una sola consulta?


8

Acabo de notar algunas tablas que tienen registros huérfanos (claves foráneas) que ya no apuntan a ninguna clave primaria. ¿Cómo puedo consultar las tablas para obtener una lista de todas esas filas? ¿Cuándo se eliminaron estos registros principales o cómo manejar esto?

Estoy usando SQL Server 2008 R2 y estamos tratando de importar 3 bases de datos similares en una después de limpiarlo, por favor avise.

Scripted una tabla secundaria de muestra (DocumentDistribution) y una tabla primaria (DocumentSource):

ALTER TABLE [dbo].[DocumentDistribution] WITH NOCHECK ADD CONSTRAINT [fk_documentdistsourceid_documentsourceid] FOREIGN KEY([DocumentDistSourceID]) REFERENCES [dbo].[DocumentSource] ([DocumentSourceID]) 
GO
 ALTER TABLE [dbo].[DocumentDistribution] CHECK CONSTRAINT [fk_documentdistsourceid_documentsourceid] 

¿No me dice eso que las tablas están en relaciones y definieron explícitamente las restricciones de clave externa?

Respuestas:


20

Esto solo debería ser posible si tiene una relación entre tablas que conoce pero SQL Server no.

SELECT fk 
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Ahora, en el futuro, defina esta relación explícitamente, entonces las personas no podrán eliminar las filas principales mientras las filas secundarias aún existan. Para eliminar las filas que no deberían estar allí hoy:

DELETE c
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

A continuación, quite sus derechos para deshabilitar estas restricciones para que dejen de hacerlo de la manera incorrecta.


También puede realizar la acción opuesta cambiando las tablas hijo y padre. Esto eliminaría todas las filas primarias a las que no hace referencia la tabla secundaria - padres huérfanos, si lo desea.
djule5
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.