我有一张名为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
由于文档表中的一个非常旧的迁移孤立项目,必须在其他表中引用。如何仅删除文档表中未在AppDocuments
或AppRequriedDocuments
中引用的文档?
答案 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);