简体   繁体   English

Oracle:按别名排序,无效标识符错误

[英]Oracle: Order By Alias, Invalid Identifier error

I'm getting an odd error, that I think I might know the answer to, but still can't seem to fix. 我收到一个奇怪的错误,我想我可能知道答案了,但仍然似乎无法解决。 It is saying that "LatestUpdatedDate" is an invalid identifier and I think it is because it runs the ORDER BY statement before it gets to the CASE statement, but that doesn't really make much sense with the way it is structured. 有人说“ LatestUpdatedDate”是一个无效的标识符,我认为这是因为它在到达CASE语句之前先运行ORDER BY语句,但这对它的结构方式并没有多大意义。 Have any ideas? 有什么想法吗?

SELECT * FROM 
( 
  SELECT sym.*, 
    (
    CASE WHEN shr_last_updt_dt >= trd_last_updt_dt 
    THEN shr_last_updt_dt 
    ELSE trd_last_updt_dt END
    ) AS LatestUpdatedDate,
    row_number() over ( ORDER BY LatestUpdatedDate DESC ) AS line_number 
  FROM trdg_sym sym  
  WHERE ((wkly_rpt_dt = :settleDate)) AND ((lower(rpt_type_cd)=lower(:reportType)))
)  
WHERE line_number BETWEEN 1 AND 25 ORDER BY line_number

在此处输入图片说明

The aliases will given after generating result set so you can't use them in Windowing functions. 别名将在生成结果集后给出,因此您不能在Windowing函数中使用它们。 You can do this: 你可以这样做:

SELECT * FROM 
( 
  SELECT sym.*, 
    (
    CASE WHEN shr_last_updt_dt >= trd_last_updt_dt 
    THEN shr_last_updt_dt 
    ELSE trd_last_updt_dt END
    ) AS LatestUpdatedDate,
    row_number() over ( ORDER BY 
     (
        CASE WHEN shr_last_updt_dt >= trd_last_updt_dt 
        THEN shr_last_updt_dt 
        ELSE trd_last_updt_dt END
     ) DESC ) AS line_number 
  FROM trdg_sym sym  
  WHERE ((wkly_rpt_dt = :settleDate)) AND ((lower(rpt_type_cd)=lower(:reportType)))
)  
WHERE line_number BETWEEN 1 AND 25 ORDER BY line_number

or wrap your subquery to another 或将您的子查询包装到另一个

SELECT * FROM 
(
  SELECT *, 
    row_number() over ( ORDER BY LatestUpdatedDate DESC ) AS line_number 
  FROM
  (
     SELECT sym.*, 
       (
          CASE WHEN shr_last_updt_dt >= trd_last_updt_dt 
          THEN shr_last_updt_dt 
          ELSE trd_last_updt_dt END
        ) AS LatestUpdatedDate 
     FROM trdg_sym sym  
     WHERE ((wkly_rpt_dt = :settleDate)) AND ((lower(rpt_type_cd)=lower(:reportType)))
   )
)  
WHERE line_number BETWEEN 1 AND 25 ORDER BY line_number

PS I don't sure for oacle syntax, but should you give aliases to subquery? PS:我不确定oacle语法,但是您应该给子查询使用别名吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM