Rumah > pangkalan data > tutorial mysql > Mengapa Menggunakan Alias ​​dalam Klausa WHERE Kadang-kadang Mengakibatkan Ralat ORA-00904, dan Bagaimana Ini Boleh Diatasi?

Mengapa Menggunakan Alias ​​dalam Klausa WHERE Kadang-kadang Mengakibatkan Ralat ORA-00904, dan Bagaimana Ini Boleh Diatasi?

Linda Hamilton
Lepaskan: 2025-01-19 15:12:11
asal
448 orang telah melayarinya

Why Does Using Aliases in a WHERE Clause Sometimes Result in an ORA-00904 Error, and How Can This Be Worked Around?

Oracle SQL: Menyelesaikan Ralat ORA-00904 Apabila Menggunakan Alias ​​dalam Klausa WHERE

Alias ​​SQL memberikan nama ringkas untuk jadual atau lajur, meningkatkan kebolehbacaan pertanyaan. Walau bagaimanapun, secara langsung menggunakan alias yang ditakrifkan dalam pernyataan SELECT dalam klausa WHERE selalunya membawa kepada ralat.

Ralat "Pengecam Tidak Sah" ORA-00904

Pertimbangkan pertanyaan ini direka bentuk untuk menentukan baris dalam table_a tidak dikemas kini baru-baru ini:

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
  AND MONTH_NO > UPD_DATE;
Salin selepas log masuk

Melaksanakan ini mungkin akan mengakibatkan ralat ORA-00904. Ini berlaku kerana Oracle memproses fasal WHERE sebelum klausa SELECT, bermakna MONTH_NO dan UPD_DATE belum ditakrifkan sebagai alias.

Penyelesaian Berkesan: Menggunakan Subkueri

Penyelesaian melibatkan penggunaan subkueri:

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;
Salin selepas log masuk

Pertanyaan dalaman mentakrifkan alias. Pertanyaan luar kemudiannya menggunakan alias yang ditakrifkan ini dalam klausa WHEREnya untuk menapis hasil dengan berkesan, mengelakkan ralat ORA-00904. Kaedah ini memastikan alias tersedia untuk penapisan.

Atas ialah kandungan terperinci Mengapa Menggunakan Alias ​​dalam Klausa WHERE Kadang-kadang Mengakibatkan Ralat ORA-00904, dan Bagaimana Ini Boleh Diatasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan