Menyelesaikan masalah ORA-00979: SQL GROUP BY Common Isu
Ralat ORA-00979 yang digeruni sering muncul apabila menggunakan klausa GROUP BY
SQL. Ralat ini menandakan ketidakpadanan antara lajur yang dipilih dan yang dikumpulkan. Khususnya, ia timbul apabila penyataan SELECT
termasuk lajur yang tidak terdapat dalam klausa GROUP BY
atau apabila fungsi bukan agregat digunakan pada lajur tidak terkumpul.
Mari kita periksa pertanyaan yang bermasalah:
<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>
Pertanyaan ini mencetuskan ORA-00979 kerana klausa GROUP BY
tidak lengkap. Untuk membetulkannya, sama ada masukkan semua lajur bukan agregat daripada senarai SELECT
dalam klausa GROUP BY
atau gunakan fungsi agregat (seperti COUNT
, SUM
, MIN
, MAX
, AVG
) kepada lajur yang tidak dihimpunkan secara eksplisit.
Berikut ialah versi yang diperbetulkan:
<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>
Perubahan utama ialah menambah cr.full_name
dan cs.cs_id
pada klausa GROUP BY
. Sebagai alternatif, jika anda hanya memerlukan hasil agregat untuk cr.full_name
dan cs.cs_id
, fungsi agregat yang sesuai harus digunakan dalam pernyataan SELECT
. Dengan memastikan setiap lajur dalam senarai SELECT
sama ada diagregatkan atau disertakan dalam klausa GROUP BY
, ralat ORA-00979 dihapuskan. Pengalihan keluar fungsi tolist()
juga membantu menyelesaikan isu kerana ia bukan fungsi agregat.
Atas ialah kandungan terperinci Mengapa Pertanyaan SQL Saya Menghasilkan Ralat ORA-00979, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!