删除表中没有在另一个表中引用的所有记录

时间:2016-12-18 11:59:12

标签: sql sql-server tsql sql-delete

我有一张名为Document的表。

文档

id int
docuid int
doc blob

然后我有两个引用表

AppRequiredDocuments

id int
appid int
docid int -> references document -> id

AppDocuments

id int
appid int
docid int -> references document -> id

由于文档表中的一个非常旧的迁移孤立项目,必须在其他表中引用。如何仅删除文档表中未在AppDocumentsAppRequriedDocuments中引用的文档?

3 个答案:

答案 0 :(得分:4)

一种方法使用删除连接:

DELETE d
FROM Document d
LEFT JOIN AppRequiredDocuments t1
  ON d.id = t1.docid
LEFT JOIN AppDocuments t2
  ON d.id = t2.docid
WHERE t1.docid IS NULL AND
      t2.docid IS NULL

这里的逻辑是,如果两个辅助表中的任何没有引用给定的Document记录,那么在docid列的连接结果集中对于其他两个表,NULL

答案 1 :(得分:3)

您可以使用union [all]运算符生成一列引用,然后检查它,例如使用[not] exists运算符:

DELETE FROM Document d
WHERE  NOT EXISTS (SELECT *
                   FROM   AppRequiredDocuments ard
                   WHERE  ard.docid = d.id
                   UNION ALL
                   SELECT *
                   FROM   AppDocuments ad
                   WHERE  ad.docid = d.id)

答案 2 :(得分:1)

您可以使用NOT EXISTS查找和删除这些项目:

delete from document d
where not exists (select 1 from AppRequiredDocuments a where a.docid = d.id);
and not exists (select 1 from AppDocuments a where a.docid = d.id);