我尝试在 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
会起作用? 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 将犹豫不决。一般来说,如果可以的话,最好避免在操作查询中加入联接。
需要注意的一个问题:这不适用于表/查询别名!
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 也会发生这种情况(我经常在删除之前使用它)...
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)
只需将查询属性设置为Unique Records YES 即可。
尝试使用这个:
DELETE Table.* FROM Table
WHERE ID IN (SELECT ID FROM TableOrQuery2)