我需要在一个CTE中获得一个自定义的排序顺序,但错误显示为
"--ORDER BY子句在视图、内联函数、派生表、子查询和普通表表达式中是无效的,除非同时指定TOP、OFFSET或FOR XML。"
有什么更好的方法来获得CTE中的自定义顺序?
ctedivisiondesc
SELECT
*
FROM
(
SELECT
DH1.[ID_NUM]
,DH1.[DIV_CDE]
,DDF.DEGREE_DESC
'DivisionDesc'
,[DTE_DEGR_CONFERRED]
,
ROW_NUMBER
()
OVER
(
PARTITION
BY
[ID_NUM]
ORDER
BY
[DTE_DEGR_CONFERRED]
DESC
)
AS
[
ROW
NUMBER]
FROM
[TmsePrd].[dbo].[DEGREE_HISTORY]
As
DH1
inner
join
[TmsePrd].[dbo].[DEGREE_DEFINITION]
AS
DDF
on
DH1.[DEGR_CDE]
=
DDF.[DEGREE]
ORDER
BY
CASE
WHEN
DDF.DEGREE_DESC
=
'Certificate'
THEN
1
WHEN
DDF.DEGREE_DESC
=
'Undegraduate'
THEN
2
WHEN
DDF.DEGREE_DESC
=
'Graduate'
THEN
3
WHEN
DDF.DEGREE_DESC
=
'Doctor of Chiropractic'
THEN
4
ELSE
5
)
AS
t
WHERE
[
ROW
NUMBER]
<=
1
SELECT
*
FROM
ctedivisiondesc
你需要对外部查询进行排序。
对子查询进行排序是不允许的,因为它是没有意义的,请考虑这个简单的例子。
WITH CTE AS ( SELECT ID FROM (VALUES (1), (2)) AS t (ID) ORDER BY ID DESC SELECT * FROM CTE ORDER BY ID ASC;外层查询的排序已经覆盖了内层查询的排序,使其成为一种浪费。
这不仅仅是对外层查询进行明确的排序,在更复杂的情况下,SQL Server可以以任何方式对子查询进行排序,以实现合并连接或分组等。因此,保证顺序或结果的唯一方法是按照你的意愿对外部查询进行排序。
由于你可能在外部查询中没有你需要的所有数据,你可能需要在CTE中再创建一个列来用于排序。