Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengelakkan Konflik Penamaan dalam SQL GROUP BY dan ORDER BY Klausa?

Bagaimana untuk Mengelakkan Konflik Penamaan dalam SQL GROUP BY dan ORDER BY Klausa?

Barbara Streisand
Barbara Streisandasal
2025-01-10 14:51:43574semak imbas

How to Avoid Naming Conflicts in SQL GROUP BY and ORDER BY Clauses?

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:

  1. Gunakan alias lajur : Tambahkan alias pada ungkapan 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>
  1. Gunakan rujukan kedudukan: Gunakan nombor untuk merujuk secara jelas kedudukan lajur dalam senarai PILIH. Contohnya:
<code class="language-sql">...
GROUP BY 1, 2, 3
...</code>
  1. mengandungi pemalar : Walaupun lajur malar (contohnya, hari) tidak perlu disertakan dalam 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!

Kenyataan:
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