SQL> desc tab1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 NAME                                               VARCHAR2(1000)

SQL> select * from tab1;

        ID NAME
---------- ---------------
         1 a
         2 b
         3 c

SQL> select * from tab1 where id > AVG(id);
select * from tab1 where id > AVG(id)
                              *
ERROR at line 1:
ORA-00934: group function is not allowed here


SQL>

错误非常清楚,并说这是无法做到的。但是我不明白为什么。查询完全有道理:

从中选择所有行 tab1 谁的 id 价值大于平均值

有帮助吗?

解决方案

AVG和其他聚合功能在数据集上工作。在其中,原因无法访问整个集合,仅对其正在运行的行的数据。如果您创建了自己的AVG函数(作为正常函数,而不是自定义聚合函数),则仅在从Where子句而不是整个ID值集时调用一个ID值。

Mezmo的解决方案将为您提供预期的结果,但是如果您想避免进行两次全表扫描(假设没有索引),则可以使用这样的窗口功能:

SELECT * FROM (SELECT AVG(id) OVER () avgid, t.* FROM tab1 t) WHERE id > avgid;

其他提示

好吧,简短的答案是“因为拉里这样说。” ;)但是您可以使用嵌套选择来完成:

select * from tab1 where id > (select avg(id) from tab1)

Hth

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top