Como posso obter todos os registros órfãos em uma única consulta?

8

Acabei de notar algumas tabelas que possuem registros órfãos (chaves estrangeiras) que não apontam mais para nenhuma chave primária. Como posso consultar as tabelas para obter uma lista de todas essas linhas? Quando esses registros pai foram excluídos ou como lidar com isso?

Estou usando o SQL Server 2008 R2 e estamos tentando importar três bancos de dados semelhantes em um após a limpeza, informe.

Script de uma tabela filho de amostra (DocumentDistribution) e tabela pai (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] 

Isso não me diz que as tabelas estão em relacionamentos e definiu explicitamente as restrições de chave estrangeira?

Shayma Ahmad
fonte

Respostas:

20

Isso só será possível se você tiver um relacionamento entre tabelas que você conhece, mas o SQL Server não.

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

Agora, no futuro, defina esse relacionamento explicitamente, para que as pessoas não possam excluir as linhas pai enquanto as linhas filho ainda existirem. Para excluir as linhas que não deveriam estar lá hoje:

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

Em seguida, retire seus direitos de desativar essas restrições para que parem de fazer isso da maneira errada.

Aaron Bertrand
fonte
Você também pode executar a ação oposta alternando as tabelas filho e pai. Isso excluiria todas as linhas pai que não são referidas pela tabela filha - pais órfãos, se desejar.
djule5