70 votes

À l'aide d'un Alias dans la clause where.

J'ai une requête qui est censé m'afficher toutes les lignes dans Une table qui n'ont pas été mis à jour assez récemment. (Chaque ligne doit être mis à jour dans un délai de 2 mois après "month_no".):

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

La dernière ligne dans la clause where provoque une "ORA-00904 Identifiant Invalide erreur". Inutile de dire, je ne veux pas répéter tout DÉCODER fonction dans ma clause where. Toutes les pensées? (Les deux corrections et des solutions de contournement accepté...)

115voto

Tomalak Points 150423

Ce n'est pas possible directement, parce que chronologiquement, OÙ il se passe avant de SÉLECTIONNER, ce qui est toujours la dernière étape dans la chaîne d'exécution.

Vous pouvez faire un sous-sélectionner et filtrer sur elle:

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

Intéressant peu d'info passés de commentaires:

Il devrait y avoir pas de gain de performance. Oracle n'a pas besoin de se matérialiser intérieure des requêtes avant d'appliquer de l'extérieur les conditions -- Oracle examinera la transformation de cette requête à l'interne et à poussez le prédicat vers le bas dans l'intérieur de la requête et le fera si c'est le coût efficace. – Justin Grotte

16voto

me_an Points 90
 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 .identifier = B.identifier
HAVING MONTH_NO > UPD_DATE

11voto

James Points 19

Ou vous pouvez avoir votre alias en HAVING clause

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X