使用不含聚合函數的GROUP BY 時,必須了解Oracle 的操作方式,以避免遇到「不是GROUP BY 表達式」錯誤。
GROUP BY 將指定列具有相同值的行分組,並產生單一結果行。但是,未出現在聚合函數中的欄位必須包含在 GROUP BY 子句中,以識別分組值的唯一組合。
請考慮下表:
EMP +-------+------+------+ | EmpNo | EName | Sal | +-------+------+------+ | 7839 | King | 5000 | | 7698 | Blake | 2850 | | 7782 | Clark | 2450 | +-------+------+------+
示例1:
SELECT EName, Sal FROM EMP GROUP BY EName, Sal
結果:
+------+------+ | EName | Sal | +------+------+ | King | 5000 | | Blake | 2850 | | Clark | 2450 | +------+------+
此查詢正確分組行並傳回自分組列(EName 和Sal)以來的所有行) 匹配。
範例2:
SELECT EName, Sal FROM EMP GROUP BY EName
結果:
ORA-00979: not a GROUP BY expression
此查詢失敗,因為Sal 未包含在GROUP BY 子句中。 Oracle 不知道如何聚合同一 EName 具有不同 Sal 值的多行。
範例3:
SELECT EName, Sal FROM EMP GROUP BY Sal
結果:
ORA-00979: not a GROUP BY expression
此查詢也失敗,因為EName在GROUP 中BY 條款。 Oracle 需要知道哪個 EName 與每個唯一的 Sal 值關聯。
範例4:
SELECT EmpNo, EName, Sal FROM EMP GROUP BY Sal, EName
結果:
ORA-00979: not a GROUP BY expression
此查詢失敗,因為選擇欄位(Emp 、EName、Sal)的數量超過了數量GROUP BY子句中的列數(Sal、EName)。考慮到唯一的組合,Oracle 要求所選列成為分組的一部分。
範例5:
SELECT EmpNo, EName, Sal FROM EMP GROUP BY EmpNo, EName, Sal
結果:
+-------+------+------+ | EmpNo | EName | Sal | +-------+------+------+ | 7839 | King | 5000 | | 7698 | Blake | 2850 | | 7782 | Clark | 2450 | +-------+------+------+
此查詢成功,因為所有選定的查詢列都包含在GROUP BY 中條款。 Oracle 考慮 EmpNo、EName 和 Sal 的每個唯一組合,從而產生三個不同的行。
以上是為什麼我的 Oracle GROUP BY 查詢回傳「不是 GROUP BY 表達式」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!