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
Libérer: 2025-01-19 15:32:10
original
441 Les gens l'ont consulté

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 :

SELECT *
FROM table_a A
JOIN table_b B ON A.identifier = B.identifier
WHERE MONTH_NO > UPD_DATE
Copier après la connexion

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.

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
Copier après la connexion

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.

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
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal