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