Oracle
 sql >> Database >  >> RDS >> Oracle

Utilizzo di un alias in una clausola WHERE

Questo non è possibile direttamente, perché cronologicamente, WHERE accade prima SELECT, che è sempre l'ultimo passaggio della catena di esecuzione.

Puoi fare una sottoselezione e filtrare su di essa:

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

Informazioni interessanti sono state spostate dai commenti:

Non dovrebbe esserci alcun impatto sulle prestazioni. Oracle non ha bisogno di materializzare le query interne prima di applicare le condizioni esterne:Oracle prenderà in considerazione la trasformazione di questa query internamente e spingerà il predicato nella query interna e lo farà se è conveniente. – Grotta di Giustino