如何在 Access 中使用来自另一个表的联接从一个表中删除项目?

Posted

技术标签:

【中文标题】如何在 Access 中使用来自另一个表的联接从一个表中删除项目?【英文标题】:How do I delete items from one table using a join from another in Access? 【发布时间】:2013-07-12 15:08:05 【问题描述】:

我已经尝试了很多不同的方法,但是在所有这些方法中都得到了奇怪的错误结果。我有一个事务主表:Transactions 和一个查询ArchiveDelete,它根据LastModifyDate 从临时表中查找新事务。我想删除 ConfirmationNumber in Transactions = ConfirmationNumber in ArchiveDelete 的事务。

我的第一次尝试很简单:

DELETE Transactions.*
FROM Transactions INNER JOIN ArchiveDelete ON Transactions.ConfirmationNumber = ArchiveDelete.ConfirmationNumber;

我收到一个错误:“无法从指定的表中删除。”点击帮助是没有用的。我对这些表拥有完全的权利。我试图用谷歌搜索错误,一个建议是运行它:

DELETE Transactions.*
FROM Transactions Where Transactions.ConfirmationNumber in (Select ConfirmationNumber from ArchiveDelete)

但这需要很长时间,而且我没有一整天的时间来进行简单的删除。我只需要删除 183 笔交易。

我也在这里尝试了使用 Exists 删除:How to delete in MS Access when using JOIN's?

DELETE Transactions.*
FROM Transactions 
Where Exists(Select 1 from ArchiveDelete Where ArchiveDelete.ConfirmationNumber = Transactions.ConfirmationNumber) = True

但现在它想删除我表中的所有 47073 行,而不仅仅是匹配的 183 行。

我做错了什么?为什么这么难?

【问题讨论】:

【参考方案1】:

我相信因为ArchiveDelete 是一个查询可能是您遇到问题的原因。尝试创建一个临时表 ArchiveDeleteTemp(至少用于测试)并改用它。

DELETE Transactions.*
FROM Transactions INNER JOIN ArchiveDeleteTemp ON Transactions.ConfirmationNumber = ArchiveDeleteTemp.ConfirmationNumber;

【讨论】:

谢谢! ArchiveDelete 是两个实际表的并集。我能够从源表中的事务中删除。这是两步而不是一步,但它有效。仍然觉得在某个地方“应该”有更好的解决方案。 不幸的是,由于 JET 中的 UNION 引起的复杂性,我认为这是一个限制。在 Access 之前,我没有遇到任何与此类似的问题,但也许对如何实现 DB 更了解的人可以解释原因。此外,如果这完全解决了您的问题,我们将不胜感激。

以上是关于如何在 Access 中使用来自另一个表的联接从一个表中删除项目?的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2013 中的嵌套 SQL 联接

如何使用内部联接创建触发器

来自三个表的左联接

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥

两个表的完全联接,两个表都有条件

如何使用条件使用来自单独表的数据更新一个表