【问题标题】:How to use ORDER BY with multiple columns when usng GROUP BY and JOIN使用 GROUP BY 和 JOIN 时如何对多列使用 ORDER BY
【发布时间】:2013-12-22 19:27:54
【问题描述】:

我试图在 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 时,查询执行良好。

请帮助我找出上述查询中的问题。提前感谢任何帮助。

【问题讨论】:

  • 查询似乎得到了每个部门的员工总数,为什么需要通过e.employee_id 订购它,因为结果将只包含一个部门的员工总数,没有关于特定部门的信息员工左右
  • 是的,Akash 你是对的。我们不需要使用employee_id 进行排序,但我试图找出在ORDER BY 子句中指定的列的限制。因为我们可以从指定的表中指定任何列,即使它不在选择列表中。何时需要允许 order by 子句中不在选择列表中的列?请建议任何资源来解释 Oracle SQL 查询执行顺序逐步处理表数据。谢谢。

标签: sql oracle oracle10g sql-order-by


【解决方案1】:

摘自documentation

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

  • 常量
  • 聚合函数
  • 分析函数
  • USER、UID 和 SYSDATE 函数
  • 与 group_by_clause 中的表达式相同的表达式
  • 由上述表达式组成的表达式对于组中的所有行的计算结果都相同

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

【讨论】:

    【解决方案2】:

    你的问题是这样的;

    GROUP BY d.DEPARTMENT_ID 
    ORDER BY d.DEPARTMENT_ID, e.EMPLOYEE_ID;
    

    GROUP BY d.DEPARTMENT_ID 将为每个部门生成一组e.EMPLOYEE_IDs,这意味着ORDER BY ..., e.EMPLOYEE_ID 将尝试按 ID 集而不是特定 ID 进行排序。

    一种可能的解决方法是使用聚合函数来选择集合中的特定 ID 进行排序,例如 ORDER BY d.DEPARTMENT_ID, MAX(e.EMPLOYEE_ID); 会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      相关资源
      最近更新 更多