2013-12-22 74 views
0

我想在Oracle 10g中執行下面的查詢,我們可以指定不在SELECT列表中的ORDER BY子句中的列。如何在使用GROUP BY和JOIN時使用ORDER BY與多列

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然後查詢執行正常。

請幫助我確定上述查詢中的錯誤。任何幫助提前讚賞。

+1

查詢似乎得到每個部門的員工總數,爲什麼需要通過'e.employee_id'來訂購,因爲結果只包含部門中的員工總數,沒有關於特定員工的信息等等 – Akash

+0

是阿卡什你是對的。我們不需要通過使用employee_id來進行排序,但我正在嘗試找出ORDER BY子句中指定的列的限制條件。正如我們可以指定表中的任何列,即使它不在選擇列表中。何時需要允許不在選擇列表中的order by子句中的列?請提供解釋Oracle SQL查詢執行順序的任何資源,逐步處理表數據。謝謝。 – RaoPotla

回答

2
documentation

摘錄:

如果你在同一個語句指定group_by_clause,那麼這個 order_by_clause生成受限於下列表達式:

  • 常量
  • 聚合函數
  • 分析函數
  • 函數U SER,UID,和SYSDATE
  • 表達式的那些相同的group_by_clause
  • 表達式,其包含前述的表達式計算結果爲對於所有行具有相同值的一組

在換句話說,如果你有GROUP BY然後你不能ORDER BY由不屬於GROUP BY子句的任何列。

+0

感謝@Yaroslav提供的信息和鏈接。 – RaoPotla

2

你的問題是這樣的;

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

GROUP BY d.DEPARTMENT_ID將導致每個部門一組e.EMPLOYEE_ID s,這意味着ORDER BY ..., e.EMPLOYEE_ID將試圖通過設定的ID,而不是特定ID的命令。

一個可能的解決方法是使用聚合函數來選擇要排序的集合中的特定ID,例如ORDER BY d.DEPARTMENT_ID, MAX(e.EMPLOYEE_ID);可以工作。