0>All()
子查询什么都不返回时如何false
返回?从逻辑上讲,就我而言,如果 all() 中没有任何内容,则 All() 不能 <0。
例子:
select x from table
where 0 > ALL(complex subquery)
如何修改它以使其为空列表返回 false。子查询又长又复杂,我不想重复两次,一次是exists(),一次是0>ALL()
0>All()
子查询什么都不返回时如何false
返回?从逻辑上讲,就我而言,如果 all() 中没有任何内容,则 All() 不能 <0。
例子:
select x from table
where 0 > ALL(complex subquery)
如何修改它以使其为空列表返回 false。子查询又长又复杂,我不想重复两次,一次是exists(),一次是0>ALL()
您可以使用
select x
from table
where x > (SELECT MAX(foo)
FROM complex_subquery
HAVING COUNT(*) = COUNT(foo))
如果子查询不返回任何行,select MAX(foo)
则将返回NULL
并x > NULL
计算结果为,unknown
因此不会被WHERE
.
如果有任何NULL
值,foo
则该HAVING
子句用于确保查询不返回任何行,以便维护正确的语义(如@hvdALL
所指出的)
(我会推荐 Martin Smith 对此的回答。)
一种选择是 CTE:
; with CteAlias as
(
... complex subquery ...
)
select col1
from table
where exists (select * from CteAlias)
and x > ALL (select col1 from CteAlias)
这仅适用于子查询与表不相关的情况。
您总是可以将返回的值存储complex query
在表变量/临时表中,然后在主查询中使用它,除非这个复杂的子查询依赖于主查询?
此外,您可能希望考虑将CTE用于复杂查询,并以这种方式重用代码。
可以将公用表表达式 (CTE) 视为在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 类似于派生表,因为它不存储为对象,并且仅在查询期间持续存在。与派生表不同,CTE 可以是自引用的,并且可以在同一查询中多次引用。