【发布时间】:2011-04-06 15:35:57
【问题描述】:
我在 Access 数据库中有一个表,其中的记录可以从其他两个表中的任何一个中引用。如果其他任何一个都没有引用它们,我需要从该表中删除记录。 到目前为止,我最好的解决方案是创建一个子查询来返回引用记录的 id 并从删除查询中引用子查询。 (子查询必须分开,因为 Access 不允许在嵌套子查询中使用 UNION。)
所以...
选择查询:
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
删除查询:
DELETE * FROM TableA WHERE id NOT IN (SELECT * FROM SelectQuery)
这太慢了……一定有更好的方法吗?
我试图避免将布尔值“Used”字段添加到 TableA ...
【问题讨论】:
-
最后我咬紧牙关,在表 A 中添加了一个 Used 列。使用两个单独的查询更新了 Used 列,每个查询一个用于其他表。然后删除 Used=No 的所有记录。将执行时间从 56 分钟减少到 3 秒。
-
56 分钟?即使您没有索引并且正在执行三个完整的表扫描,我也很难相信它会花费那么长时间?整个表的嵌套子查询是否在每条记录中重复?
-
好吧,UNION 不能使用索引。