簡體   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