在 WHERE 子句中使用别名

2024-02-06

我有一个查询,旨在显示表 A 中最近尚未更新的任何行。 (每行应在“month_no”之后的 2 个月内更新。):

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

WHERE 子句中的最后一行会导致“ORA-00904 无效标识符”错误。不用说,我不想在 WHERE 子句中重复整个 DECODE 函数。有什么想法吗? (修复和解决方法均已接受...)


这不可能直接发生,因为按时间顺序,WHERE 发生beforeSELECT,它始终是执行链中的最后一步。

您可以对其进行子选择和过滤:

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会考虑 在内部转换此查询并 将谓词推入内部 查询,如果有成本就会这样做 有效的。 –贾斯汀·凯夫 https://stackoverflow.com/users/10397/justin-cave

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WHERE 子句中使用别名 的相关文章

随机推荐