SQL GROUP BY
dan ORDER BY
Konflik Penamaan Klausa: Penyelesaian
Pertanyaan asal menghadapi masalah apabila mengumpulkan data mengikut model perkakasan, jenis hasil dan kes disebabkan oleh konflik penamaan antara lajur ungkapan CASE
yang dikira dan lajur sumber (attempt.result
). Ini membawa kepada berbilang baris untuk jenis dan kombinasi huruf besar yang sama.
Penyelesaian terletak pada mengelakkan penggunaan langsung nama lajur sumber dalam klausa GROUP BY
. Berikut ialah dua pendekatan yang berkesan:
Kaedah 1: Himpunkan mengikut ungkapan CASE secara langsung:
Daripada mengumpulkan mengikut attempt.result
, kumpulkan mengikut ungkapan CASE
itu sendiri:
<code class="language-sql">GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
Ini secara langsung mengumpulkan data berdasarkan hasil pengiraan pernyataan CASE
, menghapuskan kekaburan.
Kaedah 2: Gunakan alias lajur:
Tetapkan alias pada CASE
lajur output ungkapan:
<code class="language-sql">SELECT ..., CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 GROUP BY model.name, attempt.type, result1</code>
Alyas result1
dengan jelas membezakan lajur yang dikira daripada lajur sumber, menyelesaikan konflik. Ambil perhatian bahawa ORDER BY
akan mengutamakan nama lajur beralias (result1
) dalam kes ini.
Amalan Terbaik: Rujukan Kedudukan
Untuk mengelakkan konflik penamaan sepenuhnya, gunakan rujukan kedudukan dalam klausa GROUP BY
dan ORDER BY
. Pendekatan ini kurang terdedah kepada ralat dan meningkatkan kebolehbacaan pertanyaan, terutamanya dalam pertanyaan kompleks. Contoh di bawah menunjukkan teknik ini dalam pertanyaan yang dipermudahkan dan ditulis semula:
<code class="language-sql">SELECT m.name, a.type, CASE WHEN a.result = 0 THEN 0 ELSE 1 END AS result, CURRENT_DATE - 1 AS day, count(*) AS ct FROM attempt a JOIN prod_hw_id p USING (hard_id) JOIN model m USING (model_id) WHERE ts >= '2013-11-06 00:00:00' AND ts < CURRENT_DATE --Corrected the incomplete WHERE clause GROUP BY 1, 2, 3 -- Positional references for model.name, a.type, result ORDER BY 1, 2, 3 -- Positional references for model.name, a.type, result</code>
Pertanyaan yang disemak ini lebih ringkas dan mengelakkan kemungkinan pertembungan penamaan. Ingat untuk sentiasa menyemak klausa WHERE
anda untuk kesempurnaan. Yang asal tidak lengkap dan dibetulkan di atas.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Konflik Penamaan dalam SQL GROUP BY dan ORDER BY Klausa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!