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
不过,我的目的确实是:
- 如果子查询 returns 正好有 1 个值等于标量值 (
<my_id>
) ==> 删除
- else (0, or 2 or more values, or 1 non-equal value) ==> 不要删除(忽略)
问题
IN
和EXISTS
我都不想要。我需要类似“等于”的东西,它可以将标量值与可能的多值行进行比较。
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 什么也没有,也没有匹配项(所以什么都没有被删除)。
描述
我正在尝试做类似的事情:
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
不过,我的目的确实是:
- 如果子查询 returns 正好有 1 个值等于标量值 (
<my_id>
) ==> 删除 - else (0, or 2 or more values, or 1 non-equal value) ==> 不要删除(忽略)
问题
IN
和EXISTS
我都不想要。我需要类似“等于”的东西,它可以将标量值与可能的多值行进行比较。
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 什么也没有,也没有匹配项(所以什么都没有被删除)。