Oracle SQL嵌套查询报ORA-00904错误:MAX_VAL标识符无效求助
解决ORA-00904错误并实现需求的Oracle SQL写法
错误原因分析
你提供的SQL报错有两个核心问题:
- 列别名缺失:子查询中的
count(er_val)未定义列别名,你误将子查询的表别名max_val当成了列名,Oracle无法识别该标识符,触发ORA-00904。 - 逻辑错误:外层
group by er_cli搭配max(max_val)毫无意义——每个分组仅对应一行数据,取最大值就是该行本身的计数,无法筛选出拥有最高计数的er_cli。
正确实现方式
方式一:用窗口函数(Oracle 12c+推荐)
通过RANK()窗口函数直接为每个er_cli的计数排名,筛选排名第一的结果(支持并列最高的场景):
SELECT er_cli, val_count FROM ( SELECT er_cli, COUNT(er_val) AS val_count, RANK() OVER(ORDER BY COUNT(er_val) DESC) AS rnk FROM f_entrel GROUP BY er_cli ) WHERE rnk = 1;
- 若不需要并列结果,仅取任意一个最高计数的
er_cli,可将RANK()替换为ROW_NUMBER()。
方式二:子查询嵌套找最大值(兼容所有Oracle版本)
先统计每个er_cli的计数,再找出最大计数值,最后关联筛选对应er_cli:
SELECT er_cli, val_count FROM ( SELECT er_cli, COUNT(er_val) AS val_count FROM f_entrel GROUP BY er_cli ) WHERE val_count = ( SELECT MAX(val_count) FROM ( SELECT COUNT(er_val) AS val_count FROM f_entrel GROUP BY er_cli ) );
内容的提问来源于stack exchange,提问作者Валентин Д.
相关产品推荐
相关产品推荐

