为什么此查询需要Oracle中的group by子句

时间:2017-08-13 20:07:07

标签: sql oracle subquery

有人可以解释一下为什么这个查询需要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需要这个组?

3 个答案:

答案 0 :(得分:1)

您的查询格式为 -

SELECT aggregate_function()/(subquery) FROM table;

在解析查询语法检查时,Oracle无法判断子查询是相关子查询还是非相关子查询。

如果它是相关子查询,则子查询的结果将依赖于“表”的每一行,即每个记录的子查询结果可能不同。

为了便于理解,请将子查询视为变量。
由于aggregate_function与变量一起使用,因此每个记录的值可能不同 - Oracle希望查询具有group by子句。

实施例

表:tab1

c1 | C2

A1 | 1

A2 | 1

B1 | 2

C1 | 3

表格:tab2

c3 | C4

X1 | 1

X2 | 2

Y1 | 1

Z1 | 1

<强>查询:

_SELECT count(*)/(SELECT count(*) FROM tab2 t2 WHERE t2.c4 <= t1.c2) FROM tab1 t1;_

这不行。我希望你同意。

为什么它可能适用于MSSQLMySQLPostgresql - 我不确定。可能他们主动检查子查询是相关子查询还是非相关子查询。如果它不是相关的子查询,则允许执行。

答案 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
相关问题