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

STO*_*ORM 4 sql t-sql sql-server sql-delete

我有一张桌子,叫做Document.

文件

id int
docuid int
doc blob
Run Code Online (Sandbox Code Playgroud)

然后我有两个引用表

AppRequiredDocuments :

id int
appid int
docid int -> references document -> id
Run Code Online (Sandbox Code Playgroud)

应用文件

id int
appid int
docid int -> references document -> id
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*sen 6

一种方法使用删除连接:

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
Run Code Online (Sandbox Code Playgroud)

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


Gur*_*ngh 2

您可以使用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);
Run Code Online (Sandbox Code Playgroud)