删除Access中不匹配的记录

时间:2011-04-06 15:35:58

标签: sql ms-access

我在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”字段...

4 个答案:

答案 0 :(得分:2)

@Matthew PK建议使用两个NOT IN子查询,这在理论上是一个好主意,但正如我在评论中观察到的那样,NOT IN和NOT EXISTS未被Jet / ACE优化,并且通常不会使用两侧的索引比较。我想知道子查询是否有必要:

  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)