我正在尝试在 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 引擎中发生了什么需要这样做?
原文由 Curtis Inderwiesche 发布,翻译遵循 CC BY-SA 4.0 许可协议
为了扩展我的答案,官方 SQL 规范没有特别规定在操作查询中使用联接,因为它会产生模棱两可的结果。因此,如果您可以避免在操作查询中使用 Joins,就像我在这里一样,它会更好(并且 Access 会更快乐)。 Access 想要 DISTINCTROW 的原因是,两个表之间的 Join 很可能会创建 Table1 行的重复项(即 Table2 中有多个相关行),因此 Access 会感到困惑。我还发现,如果您尝试使用 Join 并且主键不存在,Access 将会停止。一般来说,如果可以的话,最好避免在操作查询中加入联接。