Petua untuk mengelakkan konflik penamaan dalam klausa SQL GROUP BY dan ORDER BY
Dalam pertanyaan SQL yang melibatkan gabungan dan pengisihan berbilang lajur, nama lajur yang digunakan dalam klausa GROUP BY
dan ORDER BY
perlu dipertimbangkan dengan teliti kerana mungkin terdapat perbezaan penamaan antara nama lajur output dan nama lajur sumber dalam konflik bahasa SQL.
Sebagai contoh, matlamat pertanyaan adalah untuk mengumpulkan data mengikut model perkakasan (nama), jenis percubaan (jenis) dan hasil binari (hasil dipermudahkan kepada 0 atau 1). Walau bagaimanapun, output yang dikehendaki adalah untuk memaparkan hanya satu baris untuk setiap model dengan gabungan jenis dan kes yang unik.
Masalah timbul daripada menggunakan nama lajur sumber GROUP BY
dalam kedua-dua ungkapan CASE
dan result
. Standard SQL menyatakan bahawa dalam kes ini, GROUP BY
mentafsirkan result
sebagai nama lajur sumber dan ORDER BY
sebagai nama lajur output.
Untuk menyelesaikan konflik ini dan mendapatkan output yang diharapkan, terdapat beberapa cara:
CASE
, pastikan ia berbeza daripada mana-mana nama lajur sumber. Contohnya: <code class="language-sql">... CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 ... GROUP BY model.name, attempt.type, result1 ...</code>
<code class="language-sql">... GROUP BY 1, 2, 3 ...</code>
GROUP BY
, demi kejelasan ia boleh ditambah tanpa menjejaskan keputusan. Berikut ialah pertanyaan yang diubah suai menggunakan rujukan lokasi:
<code class="language-sql">SELECT model.name , attempt.type , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result , CURRENT_DATE - 1 AS day , count(*) AS ct FROM attempt JOIN prod_hw_id USING (hard_id) JOIN model 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>
Dengan memastikan nama lajur yang betul dan menggunakan rujukan kedudukan, pertanyaan kini mengagregatkan data seperti yang diharapkan, memberikan hanya satu baris hasil untuk setiap gabungan unik model, jenis dan hasil.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Konflik Penamaan dalam SQL GROUP BY dan ORDER BY Klausa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!