Sql Oracle:按别名排序,标识符错误无效
我得到了一个奇怪的错误,我想我可能知道答案,但似乎仍然无法修复。它说“LateStupDateDateDate”是一个无效的标识符,我认为这是因为它在到达CASE语句之前运行ORDER BY语句,但这对它的结构没有多大意义。你有什么想法吗Sql Oracle:按别名排序,标识符错误无效,sql,oracle,sql-order-by,Sql,Oracle,Sql Order By,我得到了一个奇怪的错误,我想我可能知道答案,但似乎仍然无法修复。它说“LateStupDateDateDate”是一个无效的标识符,我认为这是因为它在到达CASE语句之前运行ORDER BY语句,但这对它的结构没有多大意义。你有什么想法吗 SELECT * FROM ( SELECT sym.*, ( CASE WHEN shr_last_updt_dt >= trd_last_updt_dt THEN shr_last_updt_dt ELS
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
生成结果集后将给出别名,因此不能在窗口函数中使用它们。您可以这样做:
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
另外,我不确定oacle的语法是否正确,但您是否应该为子查询指定别名?生成结果集后将指定别名,因此您不能在窗口函数中使用它们。您可以这样做:
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
另外,我不确定oacle的语法是否正确,但您是否应该为子查询指定别名?生成结果集后将指定别名,因此您不能在窗口函数中使用它们。您可以这样做:
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
另外,我不确定oacle的语法是否正确,但您是否应该为子查询指定别名?生成结果集后将指定别名,因此您不能在窗口函数中使用它们。您可以这样做:
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
另外,我不确定oacle的语法是否正确,但您是否应该为子查询提供别名?谢谢。你证实了我的想法。我有一个.NET应用程序正在构造查询,因此重新编写代码将需要大量工作。我能够通过遵循您概述的第一种方法使其工作,所以我会将此标记为正确答案。谢谢想象一下,您有两个具有相同列名的子查询,并且希望将它们联接起来。您将如何引用列?嘿,我想我也会尝试第二个查询,但它不起作用。你能再检查一次,确保它在你这边起作用吗?我收到一个来自关键字未找到的
错误,此处出现预期的错误。谢谢。你证实了我的想法。我有一个.NET应用程序正在构造查询,因此重新编写代码将需要大量工作。我能够通过遵循您概述的第一种方法使其工作,所以我会将此标记为正确答案。谢谢想象一下,您有两个具有相同列名的子查询,并且希望将它们联接起来。您将如何引用列?嘿,我想我也会尝试第二个查询,但它不起作用。你能再检查一次,确保它在你这边起作用吗?我收到一个来自关键字未找到的错误,此处出现预期的错误。谢谢。你证实了我的想法。我有一个.NET应用程序正在构造查询,因此重新编写代码将需要大量工作。我能够通过遵循您概述的第一种方法使其工作,所以我会将此标记为正确答案。谢谢想象一下,您有两个具有相同列名的子查询,并且希望将它们联接起来。您将如何引用列?嘿,我想我也会尝试第二个查询,但它不起作用。你能再检查一次,确保它在你这边起作用吗?我收到一个来自关键字未找到的错误,此处出现预期的错误。谢谢。你证实了我的想法。我有一个.NET应用程序正在构造查询,因此重新编写代码将需要大量工作。我能够通过遵循您概述的第一种方法使其工作,所以我会将此标记为正确答案。谢谢想象一下,您有两个具有相同列名的子查询,并且希望将它们联接起来。您将如何引用列?嘿,我想我也会尝试第二个查询,但它不起作用。你能再检查一次,确保它在你这边起作用吗?我从关键字中得到一个,未找到预期的错误。