使用 JOIN 时如何在 MS Access 中删除?

问题描述 投票:0回答:5

我尝试在 MS Access 中使用

DELETE
子句,但在使用
JOIN
子句时遇到问题。我注意到这可以通过使用
DISTINCTROW
关键字来完成。

例如以下SQL语句不允许删除:

DELETE Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;

但是,这个声明确实:

DELETE DISTINCTROW Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;
  • 为什么使用
    DELETE
    关键字时
    DISTINCTROW
    会起作用?
  • 更具体地说,JET 引擎中发生了什么需要这样做?
sql ms-access delete-row sql-delete
5个回答
34
投票
Delete Table1.*
From Table1
Where Exists( Select 1 From Table2 Where Table2.Name = Table1.Name ) = True

为了扩展我的答案,官方 SQL 规范没有专门规定在操作查询中使用联接,因为它可能会产生不明确的结果。因此,如果您可以避免像我在这里那样在操作查询中使用联接,那就更好了(而且 Access 更高兴)。 Access 需要 DISTINCTROW 的原因是,两个表之间的联接可能会创建 Table1 行的重复项(即 Table2 中存在多个相关行),从而使 Access 感到困惑。我还发现,如果您尝试使用 Join 并且主键不存在,Access 将犹豫不决。一般来说,如果可以的话,最好避免在操作查询中加入联接。


3
投票

需要注意的一个问题:这不适用于表/查询别名!

DELETE a.*
from tblA as A
where exists (select 1 from tblB as B where a.id=b.id)

删除 tblA 中的所有记录!我分别使用 tblA 和 tblB 的别名进行了尝试 - 相同的结果(Access 2010)。

SELECT 也会发生这种情况(我经常在删除之前使用它)...


0
投票
DELETE a.*
FROM tblA AS A
WHERE EXISTS (SELECT 1 FROM tblB AS B WHERE a.id=b.id)

试试这个

DELETE tblA 
FROM tblB  
WHERE EXISTS (SELECT * FROM tblA AS A,tblB AS B WHERE A.id=B.id)

0
投票

只需将查询属性设置为Unique Records YES 即可。


0
投票

尝试使用这个:

DELETE Table.* FROM Table
WHERE ID IN (SELECT ID FROM TableOrQuery2)
© www.soinside.com 2019 - 2024. All rights reserved.