Maison >base de données >tutoriel mysql >Comment résoudre l'erreur « ORA-00904 Invalid Identifier » lors de l'utilisation d'alias dans une clause WHERE ?

Comment résoudre l'erreur « ORA-00904 Invalid Identifier » lors de l'utilisation d'alias dans une clause WHERE ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-19 15:32:10410parcourir

How to Resolve

Résoudre l'erreur d'alias invalide dans la clause WHERE

Lors de l'utilisation d'un alias dans une clause WHERE, comme dans l'exemple suivant, une erreur « ORA-00904 invalid identifier » peut se produire :

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

Cette erreur se produit car lors de l'utilisation d'alias (tels que MONTH_NO et UPD_DATE) directement dans la clause WHERE, ils ne sont pas référencés dans la liste SELECT.

Raison de l'erreur :

Lors de l'exécution de la requête, la clause WHERE est évaluée avant la liste SELECT. Par conséquent, Oracle ne peut pas reconnaître l'alias dans la clause WHERE tant que l'alias n'est pas défini dans la liste SELECT.

Solution :

Il existe deux manières principales de résoudre ce problème :

1. Sous-requête et filtrage :

Créez une sous-requête contenant les calculs et les alias nécessaires, puis filtrez en fonction des alias dans la requête externe.

<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. Expression de table commune (CTE) :

Définissez un CTE pour créer une table temporaire contenant les calculs et les alias nécessaires, puis référencez le CTE dans la requête externe.

<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>

Notes de performances :

Il existe de nombreuses optimisations dans la version actuelle d'Oracle. Oracle n'exige pas que les requêtes internes soient matérialisées avant d'appliquer des conditions externes. Le serveur abaissera le prédicat pour une exécution rentable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn