Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menyelesaikan Ralat ORA-00979 yang Disebabkan oleh Konflik Klausa GROUP BY dan ORDER BY dalam SQL?

Bagaimana untuk Menyelesaikan Ralat ORA-00979 yang Disebabkan oleh Konflik Klausa GROUP BY dan ORDER BY dalam SQL?

Patricia Arquette
Lepaskan: 2025-01-24 04:37:07
asal
634 orang telah melayarinya

How to Resolve ORA-00979 Errors Caused by GROUP BY and ORDER BY Clause Conflicts in 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:

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;
Salin selepas log masuk

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:

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;
Salin selepas log masuk

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:

GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number
ORDER BY MIN(cs.cs_id), MIN(cr.full_name);
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan