Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan Ralat 'ORA-00904 Invalid Identifier' Apabila Menggunakan Alias ​​dalam Klausa WHERE?

Bagaimana untuk Menyelesaikan Ralat 'ORA-00904 Invalid Identifier' Apabila Menggunakan Alias ​​dalam Klausa WHERE?

Linda Hamilton
Linda Hamiltonasal
2025-01-19 15:32:10352semak imbas

How to Resolve

Selesaikan ralat alias tidak sah dalam klausa WHERE

Apabila menggunakan alias dalam klausa WHERE, seperti contoh berikut, ralat "ORA-00904 tidak sah" mungkin berlaku:

<code class="language-sql">SELECT *
FROM table_a A
JOIN table_b B ON A.identifier = B.identifier
WHERE MONTH_NO > UPD_DATE</code>

Ralat ini berlaku kerana apabila menggunakan alias (seperti MONTH_NO dan UPD_DATE) secara langsung dalam klausa WHERE, ia tidak dirujuk dalam senarai SELECT.

Sebab ralat:

Semasa pelaksanaan pertanyaan, klausa WHERE dinilai sebelum senarai SELECT. Oleh itu, Oracle tidak dapat mengenali alias dalam klausa WHERE sehingga alias ditakrifkan dalam senarai SELECT.

Penyelesaian:

Terdapat dua cara utama untuk menyelesaikan masalah ini:

1. Subkueri dan penapisan:

Buat subkueri yang mengandungi pengiraan dan alias yang diperlukan, kemudian tapis berdasarkan alias dalam pertanyaan luar.

<code class="language-sql">SELECT *
FROM
(
  SELECT A.identifier, A.name,
    TO_NUMBER(DECODE(A.month_no, ...)) AS MONTH_NO,
    TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) AS UPD_DATE
  FROM table_a A
  JOIN table_b B ON A.identifier = B.identifier
) AS inner_table
WHERE MONTH_NO > UPD_DATE</code>

2. Ungkapan jadual biasa (CTE):

Tentukan CTE untuk mencipta jadual sementara yang mengandungi pengiraan dan alias yang diperlukan, dan kemudian merujuk CTE dalam pertanyaan luar.

<code class="language-sql">WITH tmp_data AS (
  SELECT A.identifier, A.name,
    TO_NUMBER(DECODE(A.month_no, ...)) AS MONTH_NO,
    TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) AS UPD_DATE
  FROM table_a A
  JOIN table_b B ON A.identifier = B.identifier
)
SELECT *
FROM tmp_data
WHERE MONTH_NO > UPD_DATE</code>

Nota Prestasi:

Terdapat banyak pengoptimuman dalam versi Oracle semasa. Oracle tidak memerlukan pertanyaan dalaman untuk diwujudkan sebelum menggunakan syarat luaran. Pelayan akan menolak predikat untuk pelaksanaan kos efektif.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'ORA-00904 Invalid Identifier' Apabila Menggunakan Alias ​​dalam Klausa WHERE?. 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