我试图在Oracle 10g中执行以下查询,我们可以在ORDER BY子句中指定不在SELECT列表中的列。
select d.DEPARTMENT_ID, count(e.EMPLOYEE_ID)
from departments d, Employees e
where d.DEPARTMENT_ID = e.DEPARTMENT_ID
group by d.DEPARTMENT_ID
order by d.DEPARTMENT_ID, e.EMPLOYEE_ID;
但是当我尝试执行上述查询时,我收到以下错误。
[Error] Execution (1: 169): ORA-00979: not a GROUP BY expression
当我从ORDER BY中删除e.EMPLOYEE_ID时,查询正在执行。
请帮我识别上述查询中的错误。提前获得任何帮助。
答案 0 :(得分:2)
你的问题是这个;
GROUP BY d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_ID, e.EMPLOYEE_ID;
GROUP BY d.DEPARTMENT_ID
将为每个部门生成一组e.EMPLOYEE_ID
,这意味着ORDER BY ..., e.EMPLOYEE_ID
将尝试按ID集合排序,而不是特定ID。
一种可能的解决方法是使用聚合函数来选择要按顺序排列的集合中的特定ID,例如ORDER BY d.DEPARTMENT_ID, MAX(e.EMPLOYEE_ID);
可以正常工作。
答案 1 :(得分:2)
如果在同一语句中指定group_by_clause,则为此 order_by_clause仅限于以下表达式:
- 常量
- 汇总功能
- 分析功能
- 函数USER,UID和SYSDATE
- 表达式与group_by_clause
中的表达式相同- 包含前面表达式的表达式,这些表达式为组中的所有行计算相同的值
换句话说,如果您有GROUP BY
,那么您不能ORDER BY
任何不属于GROUP BY
子句的列。