为什么我们不能在Where子句中的Oracle中指定组函数?
-
16-10-2019 - |
题
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
不隶属于 dba.stackexchange