2017-05-24 54 views
0

我写了一个简单的查询来比较日期,但我在查询的最后一行收到无效的标识符错误。我在下面得到以下错误。第15行恰好是查询的最后一行。Oracle SQL Select

行错误:15列:6

Select OP_DATE, 
     ID, 
     TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY') as SD 
    From DT.OP_DATES 
    Where OP_DATE_IND = 'CMPLTD' 
    And OP_DATE_STS = 'M' 
    And SD=(SELECT TO_CHAR(SYSDATE, 'DD-MM-YY') FROM DUAL) 

有什么不对的标识?

回答

2

您不能在where条件中使用别名SD。 例如:

SQL> select 1 as one 
    2 from dual 
    3 where one = (select 1 from dual) ; 
where one = (select 1 from dual) 
     * 
ERROR at line 3: 
ORA-00904: "ONE": invalid identifier 


SQL> select 1 as one 
    2 from dual 
    3 where 1 = (select 1 from dual) ; 

     ONE 
---------- 
     1 

如果你想使用的别名在where情况下,你需要用你的查询以获得含有所需的别名列结果:

SQL> select * 
    2 from (
    3   select 1 as one 
    4   from dual 
    5  ) 
    6 where one = (select 1 from dual) ; 

     ONE 
---------- 
     1 

SQL> 
+0

@BreenDeen-进一步解释Aleksej的答案:它总是帮助思考一个SQL语句中的子句的评估顺序。至少原则上,FROM子句(包括JOIN条件)和WHERE子句在其他任何事情之前被评估,而SELECT子句被评估接近结束。 SELECT子句中定义的别名对WHERE子句不可见。数据库软件的创建者可以自由地做其他事情(比如稍后定义的任何别名的“预读”),但我不知道是否有这样做的具体操作,当然Oracle不。 – mathguy

+0

@BreenDeen - 作为使用子查询的替代方法,您可以在WHERE子句的左侧重复整个TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY'),而不是使用别名。这将避免子查询外部查询结构。它更加打字,但效率并不高。该函数在查询中出现两次,但实际上并未执行两次。 Oracle引擎足够聪明,可以看到它是相同的函数,所以它只计算一次(对于每一行)。 – mathguy

+0

非常感谢! – BreenDeen

0

为了详细在接受的答案:

Select OP_DATE, 
     ID, 
     TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY') as SD 
    From DT.OP_DATES 
    Where OP_DATE_IND = 'CMPLTD' 
    And OP_DATE_STS = 'M' 
    And TO_CHAR(DT.OP_DATES.LST_UPDT_TMSP,'DD-MM-YY') = 
      (SELECT TO_CHAR(SYSDATE, 'DD-MM-YY') FROM DUAL)