Nama lajur dalam SQL GROUP BY
dan ORDER BY
klausa
Soalan:
Apabila mengumpulkan data dalam SQL, anda mesti menentukan nama lajur yang betul dalam fasal GROUP BY
dan ORDER BY
. Jika terdapat percanggahan penamaan antara lajur input dan output, keputusan mungkin tidak betul.
Penyelesaian:
GROUP BY
FasalElakkan menggunakan nama lajur sumber: Jangan gunakan nama lajur sumber (cth. attempt.result
) secara langsung untuk pengumpulan. Pengumpulan hendaklah dilakukan menggunakan ungkapan CASE
yang menentukan hasil yang diingini. Ini memastikan anda mengumpulkan mengikut nilai yang betul.
<code class="language-sql"> GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
Gunakan alias lajur: Jika anda lebih suka menggunakan nama lajur asal, berikan alias lain dalam senarai SELECT
. Ini menghalang lajur output daripada mengganggu kumpulan.
<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>
ORDER BY
FasalGunakan rujukan kedudukan: Daripada memetik nama lajur output secara langsung, gunakan rujukan kedudukan (nombor ordinal) dalam klausa ORDER BY
. Ini mengelakkan sebarang kemungkinan konflik penamaan.
<code class="language-sql"> ORDER BY 1, 2, 3</code>
Contoh:
Tulis semula pertanyaan menggunakan sintaks JOIN
yang betul, rujukan kedudukan dan menyelesaikan konflik penamaan:
<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 < '2013-11-07 00:00:00' GROUP BY 1, 2, 3 ORDER BY 1, 2, 3;</code>
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Penamaan Konflik dalam SQL GROUP BY dan ORDER BY Klausa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!