Использование Псевдонима в операторе Where

64
задан OMG Ponies 10 November 2010 в 03:16
поделиться

2 ответа

Это не возможно непосредственно, потому что хронологически, ГДЕ происходит прежде ВЫБОР, который всегда является последним шагом в цепочке выполнения.

можно сделать подвыбор и фильтр на нем:

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

Интересный бит информации переместился вверх из комментариев:

не должно быть никакого хита производительности. Oracle не должна осуществлять внутренние запросы прежде, чем применить внешние условия - Oracle рассмотрит преобразование этого запроса внутренне и снизит предикат во внутренний запрос и сделает так, если это будет экономически эффективно. †“ Justin Cave

108
ответ дан Community 24 November 2019 в 15:49
поделиться

Или вы можете указать свой псевдоним в предложении HAVING

10
ответ дан 24 November 2019 в 15:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: