[英]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.