如何在 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 中使用来自另一个表的联接从一个表中删除项目?的主要内容,如果未能解决你的问题,请参考以下文章