MySQL WHERE Subquery Klausa: Isu dan Penyelesaian Alias Lajur
Menggunakan alias lajur dalam subquery klausa MySQL WHERE
selalunya membawa kepada ralat seperti "#1054 - Lajur tidak diketahui 'guaranteed_postcode' dalam 'IN/ALL/ANY subquery'." Ini timbul daripada percubaan untuk menapis hasil berdasarkan alias (guaranteed_postcode
dalam kes ini) sebelum ia sebenarnya ditakrifkan oleh pertanyaan.
Senario Masalah:
Senario biasa melibatkan pertanyaan yang menggabungkan jadual (cth., 'pengguna' dan 'lokasi') dan mencipta lajur baharu (seperti guaranteed_postcode
daripada subrentetan lajur 'mentah'). Percubaan seterusnya untuk menapis menggunakan alias yang baru dibuat ini dalam subkueri klausa WHERE
gagal.
Mengapa Gagal:
MySQL memproses klausa WHERE
sebelum menyelesaikan alias. Oleh itu, alias guaranteed_postcode
tidak diketahui pada titik WHERE
pelaksanaan klausa. Had ini konsisten dengan piawaian SQL.
Pematuhan Standard SQL:
MySQL, mematuhi piawaian SQL, mengehadkan penggunaan alias lajur dalam fasal WHERE
. Alias digunakan dengan betul dalam klausa GROUP BY
, ORDER BY
dan HAVING
.
Penyelesaian Berkesan menggunakan HAVING:
Penyelesaian yang disyorkan ialah menggunakan klausa HAVING
. HAVING
direka untuk menapis data agregat, tetapi ia boleh mengendalikan situasi ini dengan berkesan. Begini cara untuk menulis semula pertanyaan:
<code class="language-sql">HAVING `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
Pendekatan ini memastikan alias guaranteed_postcode
dinilai selepas lajur dicipta, sekali gus menyelesaikan ralat. Klausa HAVING
menapis keputusan dengan betul berdasarkan keadaan yang diingini.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Alias Lajur dalam Subquery Klausa MySQL WHERE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!