【问题标题】:Access: DELETE query with WHERE <> clause: "At most one record can be returned by this subquery"访问:带有 WHERE <> 子句的 DELETE 查询:“此子查询最多可以返回一条记录”
【发布时间】:2020-04-29 19:01:30
【问题描述】:

我想运行这个 DELETE 查询:

DELETE * FROM Table1 WHERE Table1.ID <> (SELECT Table1.ID FROM Table1 WHERE ....)

括号中的查询返回我想保留在 Table1 中的所有 ID(此查询独立工作,我测试过)。但是,一旦我添加了 DELETE 部分,我就会收到以下错误:“此子查询最多可以返回一条记录”。我试过代码

DELETE * FROM Table1 WHERE Table1.ID NOT IN (SELECT Table1.ID FROM Table1 WHERE ....)

但是现在我的数据库挂起并且不再执行任何操作...

感谢您的帮助!

【问题讨论】:

  • 这可能不是“挂起”,而是花费了很多时间。您要删除多少行?
  • 子查询单独运行需要多长时间?
  • 子查询耗时 3 秒。我想删除 39 列的 140.000 行。
  • 是的,删除 140k 行需要时间。特别适用于 Access 等小型数据库引擎。

标签: sql database ms-access


【解决方案1】:

其实*对于delete语句来说并不是必须的,因为它会删除匹配where条件的整行。 一般&lt;&gt;(不等于)用于提供单个静态值。 (如下所示)

DELETE FROM Table1 WHERE Table1.ID <> 1

但是子查询返回行/记录(带有选定的列)。因此你得到了错误:At most one record can be returned by this subquery

来到您正在使用的NOT IN 子句,这是正确的做法,但如果子查询中涉及更多行数,NOT IN 可能会变得相当复杂,因为NOT IN 在后面进行连接引擎盖。

在您的情况下,最好的方法是使用 NOT(condition),因为您已经知道需要所需表 ID 的 condition。 (如下所示)

DELETE FROM Table1 WHERE NOT(condition)

这可以很快完成您的工作,因为没有像前面的案例那样涉及连接。

【讨论】:

  • 感谢您的回答!但不幸的是 WHERE NOT() 在 Access 中不起作用。你知道另一种可能性吗?
  • 但我确实看到 not 可用 here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多