我正在尝试在 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时,查询执行正常。
请帮助我确定上述查询中的问题。提前感谢任何帮助。
文档摘录:
如果在同一语句中指定group_by_clause,则此 order_by_clause仅限于以下表达式:
- 常数
- 聚合函数
- 分析函数
- 函数 USER、UID 和 SYSDATE
表达式- 与group_by_clause中的表达式相同
- 由上述表达式组成的表达式,这些表达式对组中的所有行的计算结果为相同的值
换句话说,如果您有GROUP BY
,则不能按不属于GROUP BY
子句的任何列ORDER BY
。
你的问题是这个;
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);
可以工作。