首頁 >資料庫 >mysql教程 >為什麼我的 SQL 查詢會導致 ORA-00979 錯誤,如何修復它?

為什麼我的 SQL 查詢會導致 ORA-00979 錯誤,如何修復它?

Susan Sarandon
Susan Sarandon原創
2025-01-24 04:47:10338瀏覽

Why Does My SQL Query Result in an ORA-00979 Error, and How Can I Fix It?

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 非聚合列,或套用聚合函數(例如COUNTSUMMINMAX, 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_idGROUP BY。 或者,如果您只需要 cr.full_namecs.cs_id 的聚合結果,則應在 SELECT 語句中使用適當的聚合函數。 透過確保 SELECT 清單中的每一列都已聚合或包含在 GROUP BY 子句中,可以消除 ORA-00979 錯誤。 刪除 tolist() 函數也有助於解決問題,因為它不是聚合函數。

以上是為什麼我的 SQL 查詢會導致 ORA-00979 錯誤,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn