Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan Ralat ORA-00979 yang Disebabkan oleh Konflik Klausa GROUP BY dan ORDER BY dalam SQL?
Menyelesaikan masalah ORA-00979: GROUP BY
dan ORDER BY
Konflik Klausa
Ralat ORA-00979 dalam SQL timbul daripada ketidakpadanan antara klausa GROUP BY
dan ORDER BY
. GROUP BY
mengagregat data, manakala ORDER BY
mengisihnya. Ralat berlaku apabila ORDER BY
menyertakan lajur yang tidak terdapat dalam GROUP BY
.
Memahami Masalah
Pertimbangkan contoh pertanyaan ini yang menghasilkan ralat ORA-00979:
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, LISTAGG(TO_CHAR(cf.fact_date, 'mm/dd/yyyy'), ',') WITHIN GROUP (ORDER BY cf.fact_date) AS "appt", cs.cs_id, cr.tracking_number FROM review cr JOIN cs ON cr.cs_sk = cs.cs_sk JOIN fact cf ON cr.review_sk = cf.review_wk WHERE UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%' AND row_delete_date_time IS NULL AND cr.fact_type_code = 183050 GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number ORDER BY cs.cs_id, cr.full_name;</code>
Ralat berpunca daripada ORDER BY cs.cs_id, cr.full_name
. cs.cs_id
dan cr.full_name
tiada dalam klausa GROUP BY
.
Penyelesaian
Untuk menyelesaikan ORA-00979, semua lajur dalam ORDER BY
mestilah sama ada dalam GROUP BY
atau diagregatkan:
Penyelesaian 1: Tambahkan pada GROUP BY
Jika lajur penting untuk mengumpulkan, masukkan lajur itu dalam fasal GROUP BY
:
<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number, cs.cs_id, cr.full_name ORDER BY cs.cs_id, cr.full_name;</code>
Penyelesaian 2: Gunakan Fungsi Agregat
Jika lajur tidak penting untuk mengumpulkan, gunakan fungsi agregat seperti MIN
, MAX
atau lain-lain yang sesuai dengan data anda:
<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number ORDER BY MIN(cs.cs_id), MIN(cr.full_name);</code>
Memilih penyelesaian yang betul bergantung pada logik pertanyaan anda dan hasil yang diingini. Menambah pada GROUP BY
mengekalkan lebih terperinci, sambil menggunakan fungsi agregat meringkaskan data dalam kumpulan. Pertimbangkan dengan teliti implikasi setiap pendekatan sebelum melaksanakannya. Ingat untuk menggunakan fungsi agregat yang sesuai berdasarkan data anda dan hasil yang diingini.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat ORA-00979 yang Disebabkan oleh Konflik Klausa GROUP BY dan ORDER BY dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!