【问题标题】:SQL: delete only if subquery (containing 0, 1, or more rows) equals scalar valueSQL:仅当子查询(包含 0、1 或更多行)等于标量值时才删除
【发布时间】:2020-09-22 17:43:26
【问题描述】:

说明

我正在尝试做类似的事情:

DELETE FROM ...
-- `<my_id>` is any given long scalar value
WHERE <my_id> = (SELECT id FROM ... WHERE ...);

这种语法并不完全正确。如果选择子查询包含多于一行,那么我们会收到如下错误:

标量子查询包含多于一行

不过,我的预期目的确实是:

  • 如果子查询正好返回 1 个等于标量值 (&lt;my_id&gt;) ==> 删除
  • else(0 个或 2 个或多个值,或 1 个不相等的值)==> 请勿删除(忽略)

问题

我既不想要IN 也不想要EXISTS。我需要类似“equals”的东西,它可以将标量值与可能的多值行进行比较。

SQL 中的语法是什么?

堆栈

特别是,我正在使用 H2 进行测试。

【问题讨论】:

  • 我删除了不一致的数据库标签。请仅使用您真正使用的数据库进行标记。
  • 谢谢戈登????

标签: sql h2


【解决方案1】:

一种方法是:

DELETE FROM ...
WHERE <my_id> IN (SELECT id FROM ... WHERE ...) AND
      (SELECT COUNT(*) FROM . . . WHERE . . .) = 1;

但是,这更简单地写成:

DELETE FROM ...
WHERE <my_id> = (SELECT MAX(id)
                 FROM . . . 
                 WHERE . .  
                 HAVING COUNT(*) = 1
                ) ;

如果计数不是1,则子查询不返回任何内容且不存在匹配项(因此不删除任何内容)。

【讨论】:

  • 谢谢戈登!我的 SQL 词汇表中缺少HAVING。由于我们正在检查我们只有一行带有HAVING COUNT(*) = 1,我猜使用MAX 只是一种技巧。我们只需要一些聚合函数,例如MIN,在这种情况下,它的工作原理与MAX 完全相同......对吗?
  • @juanmirocks 。 . .确切地。如果只有一行,则MIN()MAX() 返回相同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多