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

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

Patricia Arquette
Patricia Arquetteasal
2025-01-10 14:46:42184semak imbas

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

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 Fasal

  • Elakkan 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 Fasal

  • Gunakan 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!

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