Heim > Datenbank > MySQL-Tutorial > Wie kann der Fehler „ORA-00904 Ungültiger Bezeichner' behoben werden, wenn Aliase in einer WHERE-Klausel verwendet werden?

Wie kann der Fehler „ORA-00904 Ungültiger Bezeichner' behoben werden, wenn Aliase in einer WHERE-Klausel verwendet werden?

Linda Hamilton
Freigeben: 2025-01-19 15:32:10
Original
395 Leute haben es durchsucht

How to Resolve

Beheben Sie den Fehler eines ungültigen Alias ​​in der WHERE-Klausel

Bei Verwendung eines Alias ​​in einer WHERE-Klausel, wie im folgenden Beispiel, kann der Fehler „ORA-00904 ungültiger Bezeichner“ auftreten:

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

Dieser Fehler tritt auf, weil Aliase (z. B. MONTH_NO und UPD_DATE) direkt in der WHERE-Klausel nicht in der SELECT-Liste referenziert werden.

Fehlergrund:

Während der Abfrageausführung wird die WHERE-Klausel vor der SELECT-Liste ausgewertet. Daher kann Oracle den Alias ​​in der WHERE-Klausel erst erkennen, wenn der Alias ​​in der SELECT-Liste definiert ist.

Lösung:

Es gibt im Wesentlichen zwei Möglichkeiten, dieses Problem zu lösen:

1. Unterabfrage und Filterung:

Erstellen Sie eine Unterabfrage, die die erforderlichen Berechnungen und Aliase enthält, und filtern Sie dann basierend auf den Aliasen in der äußeren Abfrage.

<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>
Nach dem Login kopieren

2. Gemeinsamer Tabellenausdruck (CTE):

Definieren Sie einen CTE, um eine temporäre Tabelle mit den erforderlichen Berechnungen und Aliasen zu erstellen, und verweisen Sie dann in der äußeren Abfrage auf den CTE.

<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>
Nach dem Login kopieren

Leistungshinweise:

In der aktuellen Oracle-Version gibt es viele Optimierungen. Oracle verlangt nicht, dass interne Abfragen materialisiert werden, bevor externe Bedingungen angewendet werden. Der Server drückt das Prädikat für eine kostengünstige Ausführung nach unten.

Das obige ist der detaillierte Inhalt vonWie kann der Fehler „ORA-00904 Ungültiger Bezeichner' behoben werden, wenn Aliase in einer WHERE-Klausel verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage