Oracle SQL : résolution de l'erreur ORA-00904 lors de l'utilisation d'alias dans les clauses WHERE
Les alias SQL fournissent des noms concis pour les tables ou les colonnes, améliorant ainsi la lisibilité des requêtes. Cependant, l'utilisation directe d'un alias défini dans l'instruction SELECT
au sein de la clause WHERE
conduit souvent à des erreurs.
L'erreur ORA-00904 « Identifiant invalide »
Considérez cette requête conçue pour identifier les lignes de table_a
non mises à jour récemment :
<code class="language-sql">SELECT A.identifier, A.name, TO_NUMBER(DECODE(A.month_no, 1, 200803, 2, 200804, 3, 200805, 4, 200806, 5, 200807, 6, 200808, 7, 200809, 8, 200810, 9, 200811, 10, 200812, 11, 200701, 12, 200702, NULL)) as MONTH_NO, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A, table_b B WHERE A.identifier = B.identifier AND MONTH_NO > UPD_DATE;</code>
L'exécution de cette opération entraînera probablement l'erreur ORA-00904. Cela se produit parce qu'Oracle traite la clause WHERE
avant la clause SELECT
, ce qui signifie que MONTH_NO
et UPD_DATE
ne sont pas encore définis comme des alias.
Solution efficace : utiliser une sous-requête
La solution consiste à utiliser une sous-requête :
<code class="language-sql">SELECT * FROM ( SELECT A.identifier, A.name, TO_NUMBER(DECODE(A.month_no, 1, 200803, 2, 200804, 3, 200805, 4, 200806, 5, 200807, 6, 200808, 7, 200809, 8, 200810, 9, 200811, 10, 200812, 11, 200701, 12, 200702, NULL)) as MONTH_NO, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A, table_b B WHERE A.identifier = B.identifier ) AS inner_table WHERE MONTH_NO > UPD_DATE;</code>
La requête interne définit les alias. La requête externe utilise ensuite ces alias définis dans sa clause WHERE
pour filtrer efficacement les résultats, évitant ainsi l'erreur ORA-00904. Cette méthode garantit que les alias sont disponibles pour le filtrage.
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!