繁体   English   中英

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

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

我收到一个奇怪的错误,我想我可能知道答案了,但仍然似乎无法解决。 有人说“ LatestUpdatedDate”是一个无效的标识符,我认为这是因为它在到达CASE语句之前先运行ORDER BY语句,但这对它的结构方式并没有多大意义。 有什么想法吗?

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

在此处输入图片说明

别名将在生成结果集后给出,因此您不能在Windowing函数中使用它们。 你可以这样做:

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

或将您的子查询包装到另一个

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:我不确定oacle语法,但是您应该给子查询使用别名吗?

暂无
暂无

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

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