WHERE Klausa Alias Had dan Penyelesaian
Masalah:
Apabila membuat pertanyaan table_a
untuk rekod yang tidak dikemas kini baru-baru ini, menggunakan alias dalam klausa WHERE
mengakibatkan ralat "ORA-00904 Invalid Identifier". Ini berlaku kerana alias MONTH_NO
belum ditakrifkan apabila klausa WHERE
diproses.
Ini contohnya:
<code class="language-sql">SELECT A.identifier , A.name , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., NULL)) as MONTH_NO , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A, table_b B WHERE A.identifier = B.identifier AND MONTH_NO > UPD_DATE</code>
Penyelesaian:
Klausa WHERE
melaksanakan sebelum klausa SELECT
, menghalang penggunaan alias langsung. Penyelesaiannya adalah dengan menggunakan subquery:
<code class="language-sql">SELECT * FROM ( SELECT A.identifier , A.name , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., NULL)) as MONTH_NO , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A, table_b B WHERE A.identifier = B.identifier ) AS inner_table WHERE MONTH_NO > UPD_DATE</code>
Pendekatan ini mula-mula mentakrifkan alias dalam pertanyaan dalaman. Pertanyaan luar kemudian merujuk alias yang telah ditentukan ini, menyelesaikan ralat "pengecam tidak sah". SELECT *
dalam pertanyaan luar memilih semua lajur daripada set hasil pertanyaan dalam.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Membandingkan Alias Secara Terus dalam Klausa WHERE, dan Bagaimana Saya Boleh Mengatasi Perkara Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!