有人可以解释一下为什么这个查询需要Oracle中的GROUP BY子句而在MSSQL,MySQL,Postgresql中完全没问题吗?
select count(*) / (select count(*) from dual)from dual
Oracle抱怨
"[Error] Execution (1: 27): ORA-00937: not a single-group group function"
如果我改变它并像这样添加虚拟组
select count(*) / (select count(*) from dual)from dual
group by null
那么对甲骨文来说这很好。为什么Oracle需要这个组?
答案 0 :(得分:1)
您的查询格式为 -
SELECT aggregate_function()/(subquery) FROM table;
在解析查询语法检查时,Oracle无法判断子查询是相关子查询还是非相关子查询。
如果它是相关子查询,则子查询的结果将依赖于“表”的每一行,即每个记录的子查询结果可能不同。
为了便于理解,请将子查询视为变量。
由于aggregate_function与变量一起使用,因此每个记录的值可能不同 - Oracle希望查询具有group by子句。
A1 | 1
A2 | 1
B1 | 2
C1 | 3
X1 | 1
X2 | 2
Y1 | 1
Z1 | 1
<强>查询:强>
_SELECT count(*)/(SELECT count(*) FROM tab2 t2 WHERE t2.c4 <= t1.c2) FROM tab1 t1;_
这不行。我希望你同意。
为什么它可能适用于MSSQL
,MySQL
或Postgresql
- 我不确定。可能他们主动检查子查询是相关子查询还是非相关子查询。如果它不是相关的子查询,则允许执行。
答案 1 :(得分:0)
MySQL有一些在ANSI SQL中无效的语法。
基本上,这里有一个count(*)
,它是一个聚合函数。单独,它不需要group by
,但如果你添加select count(*)
可能取决于你的线 - 这不是这里的情况,但你可以在内部进行连接 - 然后你的第二个{ {1}}不是常数,你应该select
。
答案 2 :(得分:0)
As far as i know, Your first query:
select count(*) / (select count(*) from dual)from dual
Sql will understand Count() as a column and (select count() from dual) as a second column => You must group by second column.
For example:
select count(*), (select count(1) from dual)from dual
It will throw the same error. But if you group by the second column it will be true. Example
select count(*), (select count(1) from dual)from dual
group by 1