Rumah >pangkalan data >tutorial mysql >Mengapa Menggunakan Alias dalam SQL WHERE Klausa Menyebabkan ORA-00904 dan Bagaimana Saya Boleh Membetulkannya?
Oracle SQL: Menyelesaikan Ralat ORA-00904 Apabila Menggunakan Alias dalam Klausa WHERE
Dalam pertanyaan SQL, alias memudahkan ungkapan kompleks dalam SELECT
pernyataan. Walau bagaimanapun, secara langsung menggunakan alias yang ditakrifkan dalam senarai SELECT
dalam klausa WHERE
selalunya membawa kepada ralat ORA-00904 dalam Oracle. Ini berlaku kerana Oracle memproses klausa WHERE
sebelum menyelesaikan alias daripada senarai SELECT
. Oleh itu, alias tidak ditentukan pada titik WHERE
penilaian klausa.
Punca Masalah
Ralat ORA-00904 ("pengecam tidak sah") timbul kerana alias (cth., MONTH_NO
) tidak dikenali dalam klausa WHERE
. Perintah pemprosesan pertanyaan Oracle menghalang alias daripada tersedia semasa WHERE
penilaian klausa.
Penyelesaian: Subkueri dan CTE
Dua penyelesaian berkesan memintas had ini:
1. Pendekatan Subkueri:
Mengenkapsulasi pernyataan SELECT
dengan alias dalam subkueri membolehkan alias ditakrifkan dan digunakan dalam skop subkueri. Pertanyaan luar kemudian menapis hasil berdasarkan alias:
<code class="language-sql">SELECT * FROM ( SELECT A.identifier, A.name, TO_NUMBER(DECODE(A.month_no, 1, 200803, 2, 200804, 3, 200805, 4, 200806, 5, 200807, 6, 200808, 7, 200809, 8, 200810, 9, 200811, 10, 200812, 11, 200701, 12, 200702, 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>
2. Kaedah Common Table Expression (CTE):
CTE menyediakan set hasil bernama yang boleh dirujuk beberapa kali dalam satu pertanyaan. Menentukan alias dalam CTE menyelesaikan isu:
<code class="language-sql">WITH my_cte AS ( SELECT A.identifier, A.name, TO_NUMBER(DECODE(A.month_no, 1, 200803, 2, 200804, 3, 200805, 4, 200806, 5, 200807, 6, 200808, 7, 200809, 8, 200810, 9, 200811, 10, 200812, 11, 200701, 12, 200702, 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 ) SELECT * FROM my_cte WHERE MONTH_NO > UPD_DATE;</code>
Implikasi Prestasi
Walaupun kedua-dua kaedah menangani ralat ORA-00904 secara berkesan, pengoptimum pertanyaan Oracle mungkin menolak predikat ke dalam subkueri atau CTE, selalunya menafikan sebarang overhed prestasi yang ketara. Dalam kebanyakan kes, perbezaan prestasi antara penyelesaian ini dan pertanyaan bertulis naif (tanpa penyelesaian) akan diabaikan. Pilih kaedah yang paling sesuai dengan gaya pengekodan dan pilihan kebolehbacaan anda.
Atas ialah kandungan terperinci Mengapa Menggunakan Alias dalam SQL WHERE Klausa Menyebabkan ORA-00904 dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!