如何在单个查询中获取所有孤立记录?

Sha*_*mad 10 sql-server-2008-r2

我只是注意到很少有表具有不再指向任何主键的孤立记录(外键)。如何查询表以获取所有此类行的列表?当这些父记录被删除或如何处理?

我正在使用 SQL Server 2008 R2,我们试图在清理后将 3 个类似的数据库导入一个,请指教。

编写示例子表 (DocumentDistribution) 和父表 (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] 
Run Code Online (Sandbox Code Playgroud)

这不是告诉我表之间存在关系并明确定义了外键约束吗?

Aar*_*and 24

只有在您知道但 SQL Server 不知道的表之间存在关系时,这才应该是可能的。

SELECT fk 
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );
Run Code Online (Sandbox Code Playgroud)

现在,将来,明确定义这种关系,那么人们将无法在子行仍然存在的情况下删除父行。要删除今天不应该存在的行:

DELETE c
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );
Run Code Online (Sandbox Code Playgroud)

接下来,剥夺他们禁用这些约束的权利,以便他们停止以错误的方式执行此操作。