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 ?

Pourquoi ne puis-je pas comparer directement les alias dans une clause WHERE et comment puis-je contourner ce problème ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-19 15:26:10789parcourir

Why Can't I Directly Compare Aliases in a WHERE Clause, and How Can I Work Around This?

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!

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