如何在使用GROUP BY和JOIN时将ORDER BY与多列一起使用



我正在尝试在 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);可以工作。

最新更新