作业帮 > 综合 > 作业

SQL的GROUP BY错误

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/26 20:25:15
SQL的GROUP BY错误
SELECT SUM(ADMIN_ENTERED)
FROM STATE
GROUP BY YEAR_ENTERED
HAVING COUNT(YEAR_ENYERED)=MAX(COUNT(YEAR_ENTERED))
系统提示::ERROR at line 4:
ORA-00935:group function is nested too deeply
这是表格:
CREATE TABLE STATE
(STATE_NAME VARCHAR2(15) NOT NULL,
ADMIN_ENTERED NUMBER(2),
PRESNAME_ENTERED VARCHAR2(20),
YEAR_ENTERED NUMBER(4)
CONSTRAINT CHECK_YEAR_ENTERED
CHECK (YEAR_ENTERED BETWEEN 1600 AND 2100),
CONSTRAINT PRIM_KEY_STATE PRIMARY KEY (STATE_NAME)
);
想把最多的YEAR_ENTERED那组里面的ADMIN_ENYERED的int求和显示.
系统提示:HAVING COUNT(YEAR_ENYERED)=MAX(COUNT(YEAR_ENTERED))
*
ERROR at line 4:
ORA-00935:group function is nested too deeply
错误提示的意思是group部分定义条件过深.事实上在使用having条件时,一定要注意的是不要过多的使用聚合函数的.因为每一个聚合函数的计算都是非常大的,所以这里的错误就是你使用了过多的聚合函数的原因.
在SQL中存在一个叫子语句嵌套的.如:select * from A wrhere A.p in(select * from B where B.p in (select.))看似这个条件可能无限的写下去,事实上由于这种查询非常的耗时的,所以在SQL中规定是子嵌套不能超出三层.其一般情况下我们采用的都其的处理方式的,避免使用这种子查询嵌套的,如果不得已才使用一个嵌套.因为这种查询太耗内存的!所以我们都是不建议使用的!
而聚合函数根其十分类似,因为其对所以结果进行一个分筛统计,也是非常耗时的,不建议使用聚合函数的嵌套的!所以这里必须要考虑这个的问题的!
对于你的问题,我可能理解的不太透彻,但我不明白的是为什么你非要条件压到having上呢?你有没有考虑过top 1这一个参数的使用呢?
Select top 1 sum(Admin_EnyEred) as maxenyered from state
group by year_entered
order by maxenyered Desc
这种条件中我连having条件都不再使用的!
使用多重聚合时我也不知道SQL是否让通过,你可以试一下的,但我想应该是有一定的问题的,至少效率也不行!
Select max(sum(Admin_EnyEred)) as maxenyered from state
group by year_entered
从你自己的语句中我看你可能是对having条件不太理解造成的,事实上having条件与where是不同的,很多时间也是无法转化的.只有部分条件是可以转化的,having又称分组依据,也就是分组前对分组进行一个“过滤”筛选的,而不是where条件的对结果集前后都可以筛选的,所以这样的having条件从你的使用上来说根本就是不对的!