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

时间:2013-12-22 06:32:34

标签: sql oracle oracle10g sql-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时,查询正在执行。

请帮我识别上述查询中的错误。提前获得任何帮助。

2 个答案:

答案 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)

摘自documentation

  

如果在同一语句中指定group_by_clause,则为此   order_by_clause仅限于以下表达式:

     
      
  • 常量
  •   
  • 汇总功能
  •   
  • 分析功能
  •   
  • 函数USER,UID和SYSDATE
  •   
  • 表达式与group_by_clause
  • 中的表达式相同   
  • 包含前面表达式的表达式,这些表达式为组中的所有行计算相同的值
  •   

换句话说,如果您有GROUP BY,那么您不能ORDER BY任何不属于GROUP BY子句的列。