SQL:仅当子查询(包含 0、1 或更多行)等于标量值时才删除

SQL: delete only if subquery (containing 0, 1, or more rows) equals scalar value

描述

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

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

该语法不完全正确。如果 select 子查询包含多行,那么我们会得到如下错误:

Scalar subquery contains more than one row

不过,我的目的确实是:

问题

INEXISTS我都不想要。我需要类似“等于”的东西,它可以将标量值与可能的多值行进行比较。

SQL 中的语法是什么?

堆栈

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

一种方法是:

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,则子查询 returns 什么也没有,也没有匹配项(所以什么都没有被删除)。