我在Access数据库中有一个表,其中可以从另外两个表中引用记录。我需要删除该表中的记录,如果它们没有被其他任何一个引用。 到目前为止,我最好的解决方案是创建一个子查询来返回引用记录的id,并从删除查询中引用子查询。 (子查询必须是独立的,因为Access不允许在嵌套子查询中使用UNION。)
所以......
SelectQuery:
SELECT TableB.id FROM TableB INNER JOIN TableA ON TableB.id = TableA.id
UNION
SELECT TableC.id FROM TableC INNER JOIN TableA ON TableC.id = TableA.id
DeleteQuery:
DELETE * FROM TableA WHERE id NOT IN (SELECT * FROM SelectQuery)
这种情况极其缓慢......必须有更好的方法吗?
我试图避免在TableA中添加一个布尔“Used
”字段...
答案 0 :(得分:2)
DELETE *
FROM (TableA LEFT JOIN TableB ON TableA.ID = TableB.ID) LEFT JOIN TableC ON TableA.ID = TableC.ID
WHERE TableB.ID Is Null AND TableC.ID Is Null;
这肯定会使用你的索引。如果需要子查询,则可以将TableB和TableC替换为相关的子查询。
答案 1 :(得分:1)
为什么不这样:
DELETE FROM TableA
WHERE
id NOT IN (SELECT id FROM TableB)
AND
id NOT IN (SELECT id FROM TableC)
答案 2 :(得分:0)
是否可以根据您的SelectQuery创建一个新表,删除原始表,并将新表重命名为原始名称?
答案 3 :(得分:-1)
/* delete more records */
DELETE FROM table1
WHERE NOT EXISTS
(SELECT field FROM table2 WHERE table2.field = table1.field)