sql - 在 WHERE 子句中使用别名

标签 sql oracle alias decode ora-00904

我有一个查询,旨在向我显示表 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 发生在 SELECT 之前,这始终是执行链中的最后一步。

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

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

从评论中移出一些有趣的信息:

There should be no performance hit. Oracle does not need to materialize inner queries before applying outer conditions -- Oracle will consider transforming this query internally and push the predicate down into the inner query and will do so if it is cost effective. – Justin Cave

关于sql - 在 WHERE 子句中使用别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356675/

相关文章:

php - Oracle脏读

sqlplus,以1列导出查询,并且是无序的

mysql - 使用 ENDSSH heredoc 为 SSH MySQL 登录创建别名

sql - 我可以在不使用存储过程的情况下检查两个子查询是否返回相同的结果吗?

sql - MariaDB:COUNT DISTINCT 是否被窃听?

第一次初始化数据库的SQL脚本

java - 尝试使用 spring 和 hibernate 用户 oracle db 时出错

用于 cd 到 git root 的 shell 命令的 git 别名未按预期工作

php - Netbeans 和 PHP; class_alias 和代码完成

mysql - 正确的数据库设计