Maison >base de données >tutoriel mysql >Pourquoi ne puis-je pas comparer directement les alias dans une clause WHERE et comment puis-je contourner ce problème ?
Limitations et solutions des alias de la clause WHERE
Problème :
Lors de l'interrogation de table_a
pour des enregistrements non récemment mis à jour, l'utilisation d'alias dans la clause WHERE
entraîne une erreur « ORA-00904 Invalid Identifier ». Cela se produit car l'alias MONTH_NO
n'est pas encore défini lorsque la clause WHERE
est traitée.
Voici un exemple :
<code class="language-sql">SELECT A.identifier , A.name , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., 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>
Solution :
La clause WHERE
s'exécute avant la clause SELECT
, empêchant l'utilisation directe d'alias. La solution est d'utiliser une sous-requête :
<code class="language-sql">SELECT * FROM ( SELECT A.identifier , A.name , TO_NUMBER(DECODE( A.month_no, 1, 200803, ..., 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>
Cette approche définit d'abord les alias dans la requête interne. La requête externe fait ensuite référence à ces alias déjà définis, résolvant ainsi l'erreur « identifiant invalide ». Le SELECT *
dans la requête externe sélectionne toutes les colonnes du jeu de résultats de la requête interne.
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!