ORA-00979 故障排除:常見 SQL GROUP BY 問題
使用 SQL 的 GROUP BY
子句時,常常會出現可怕的 ORA-00979 錯誤。 此錯誤表示所選列與分組列之間不符。 具體來說,當 SELECT
語句包含 GROUP BY
子句中不存在的欄位時,或當非聚合函數應用於未分組的欄位時,就會出現這種情況。
讓我們檢查一個有問題的查詢:
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", cs.cs_id, cr.tracking_number FROM review cr, cs, fact cf WHERE cr.cs_sk = cs.cs_sk AND UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%' AND row_delete_date_time IS NULL AND cr.review_sk = cf.review_wk(+) AND cr.fact_type_code (+) = 183050 GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number ORDER BY cs.cs_id, cr.full_name;</code>
此查詢會觸發 ORA-00979,因為 GROUP BY
子句不完整。 若要修正此問題,請在 子句中包含 清單中的SELECT
所有GROUP BY
非聚合列,或套用聚合函數(例如COUNT
、SUM
、MIN
、MAX
, AVG
) 到那些未明確分組的欄位。
這是修正後的版本:
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, to_char(cf.fact_date, 'mm/dd/yyyy') "appt", cs.cs_id, cr.tracking_number FROM review cr, cs, fact cf WHERE cr.cs_sk = cs.cs_sk AND UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%' AND row_delete_date_time IS NULL AND cr.review_sk = cf.review_wk(+) AND cr.fact_type_code (+) = 183050 GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cr.full_name, cs.cs_id ORDER BY cs.cs_id, cr.full_name;</code>
關鍵的變化是在 cr.full_name
子句中加入 cs.cs_id
和 GROUP BY
。 或者,如果您只需要 cr.full_name
和 cs.cs_id
的聚合結果,則應在 SELECT
語句中使用適當的聚合函數。 透過確保 SELECT
清單中的每一列都已聚合或包含在 GROUP BY
子句中,可以消除 ORA-00979 錯誤。 刪除 tolist()
函數也有助於解決問題,因為它不是聚合函數。
以上是為什麼我的 SQL 查詢會導致 ORA-00979 錯誤,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!