执行Oracle SQL查询报ORA-00979非GROUP BY表达式错误如何解决
问题原因
- 核心规则不匹配:Oracle要求使用
GROUP BY子句时,SELECT列表中所有未被聚合函数(COUNT/SUM/MAX/MIN等)包裹的字段,必须完整出现在GROUP BY的字段列表中。你的查询SELECT后有8个非聚合字段,但GROUP BY后仅写了SECTION_NAME一个字段,完全不符合规则,直接触发ORA-00979报错。 - 存在低级语法错误:原SQL中
GROUP BY EMP_OFFICIAL.SECTION_NAMEORDER BY部分,SECTION_NAME和ORDER之间漏了空格,属于拼写错误,即使GROUP BY规则符合也无法正常执行。
解决办法
先明确你使用GROUP BY的实际需求,对应调整即可:
场景1:仅需要查询符合条件的员工列表,不需要分组统计
直接删除多余的GROUP BY子句即可,修正后的SQL如下:
SELECT FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMP_MOBILE_NO, NEW_EMPNO , SECTION_NAME, EMP_TYPE, JOINING_DATE FROM EMP_OFFICIAL,EMP_PERSONAL WHERE EMP_PERSONAL.STATUS='Active' AND EMP_OFFICIAL.WORK_ENT='Worker' AND EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO ORDER BY EMP_PERSONAL.NEW_EMPNO DESC
注:也建议把老旧的隐式连接写法换成显式INNER JOIN写法,可读性更强
场景2:需要按部门(SECTION_NAME)做分组统计
把SELECT列表调整为聚合字段+GROUP BY字段即可,比如统计每个部门的在职工人数量:
SELECT SECTION_NAME, COUNT(*) AS EMP_CNT FROM EMP_OFFICIAL INNER JOIN EMP_PERSONAL ON EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO WHERE EMP_PERSONAL.STATUS='Active' AND EMP_OFFICIAL.WORK_ENT='Worker' GROUP BY SECTION_NAME ORDER BY EMP_CNT DESC
场景3:需要按部门分组,每个部门仅取1条员工记录
用窗口函数实现即可,不需要写GROUP BY:
SELECT * FROM ( SELECT FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMP_MOBILE_NO, NEW_EMPNO , SECTION_NAME, EMP_TYPE, JOINING_DATE, ROW_NUMBER() OVER(PARTITION BY SECTION_NAME ORDER BY NEW_EMPNO DESC) AS RN FROM EMP_OFFICIAL INNER JOIN EMP_PERSONAL ON EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO WHERE EMP_PERSONAL.STATUS='Active' AND EMP_OFFICIAL.WORK_ENT='Worker' ) T WHERE RN = 1 ORDER BY NEW_EMPNO DESC
内容的提问来源于stack exchange,提问作者MD Amin Uddin
相关产品推荐
相关产品推荐

