好问题,因为它看起来非常像它不应该乍一看,但是当你深入挖掘时,它应该没有group by
。它在解析器中看起来像一个错误,或者至少不一致。
嵌套选择不相关的,因此只需要执行一次,使得它的结果有效的常数,和documentation says:
在含有GROUP BY子句的查询,的元素选择列表可以是聚合函数,GROUP BY表达式,常量或涉及其中之一的表达式。
select min(updated_at), max(updated_at), 42 as done
from domain_cdc where app_context_id = 1561;
...它运行的罚款,并有道理从文档所说:
如果与实际的计数值替换它,你将不会被需要的群体。不一致性是与嵌套的选择,如果你这样做,而不是它会抱怨:
select min(updated_at), max(updated_at),
(select count(*) from domain_cdc where app_context_id = 1561
and domain_cdc_status = 'DONE') as done
from domain_cdc where app_context_id = 1561;
SQL Error: ORA-00937: not a single-group group function
但如果你有多余的group by null
。因此,从一个角度来看,解析器不知道嵌套的select可以被看作一个常量,并且期望group by
子句,但是它确实知道表达式不需要实际上在group by
中。
如果嵌套选择有相关性,则group by null
不会工作之一:
select min(updated_at), max(updated_at),
(select count(*) from domain_cdc dc2
where dc2.app_context_id = dc1.app_context_id
and domain_cdc_status = 'DONE') as done
from domain_cdc dc1
where app_context_id = 1561
group by null;
SQL Error: ORA-00979: not a GROUP BY expression
所以它只是受了一点原始查询混淆。奇怪的是,但我认为大多是无害的,而且我意识到这并不完全回答这个问题......但它看起来与bug 18697654非常相似,如果这有什么帮助的话。
你不需要嵌套查询虽然这里,你可以使用一个case语句:
select min(updated_at), max(updated_at),
count(case when domain_cdc_status = 'DONE' then updated_at end) as done
from domain_cdc where app_context_id = 1561;
count
只计算不空值;该案例使所有不是'DONE'
为空,因此它们从该聚合中排除。由于您现在再没有非聚合列,并且解析可以理解发生了什么,因此您不需要group by
。
这根本不是我的问题。 –