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


8

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

我使用的是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] 

难道不是告诉我表是在关系中并明确定义了外键约束吗?

Answers:


20

仅当您知道的表之间有关系但SQL Server没有关系时,才应该这样做。

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

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

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

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


您还可以通过切换子表和父表来执行相反的操作。如果您愿意的话,这将删除子表未引用的所有父行-孤立父母。
djule5 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.