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

新手上路,请多包涵

我正在尝试在 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 许可协议

阅读 791
2 个回答
Delete Table1.*
From Table1
Where Exists( Select 1 From Table2 Where Table2.Name = Table1.Name ) = True

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

原文由 Thomas 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Vid 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进