相关文章推荐
打篮球的冰棍  ·  Element-ui ...·  12 月前    · 
英姿勃勃的勺子  ·  【Regular ...·  2 年前    · 
喝醉的青椒  ·  Element: innerHTML ...·  2 年前    · 
侠义非凡的小蝌蚪  ·  X-MOL·  2 年前    · 

我需要在一个CTE中获得一个自定义的排序顺序,但错误显示为

"--ORDER BY子句在视图、内联函数、派生表、子查询和普通表表达式中是无效的,除非同时指定TOP、OFFSET或FOR XML。"

有什么更好的方法来获得CTE中的自定义顺序?

ctedivisiondesc SELECT * FROM ( SELECT --TOP 1 --[APPID] DH1.[ID_NUM] --,[SEQ_NUM_2] --,[CUR_DEGREE] --,[NON_DEGREE_SEEKING] ,DH1.[DIV_CDE] ,DDF.DEGREE_DESC 'DivisionDesc' --,[DEGR_CDE] --,[PRT_DEGR_ON_TRANSC] --,[ACAD_DEGR_CDE] ,[DTE_DEGR_CONFERRED] --,MAX([DTE_DEGR_CONFERRED]) AS Date_degree_conferred , ROW_NUMBER () OVER ( PARTITION BY [ID_NUM] ORDER BY [DTE_DEGR_CONFERRED] DESC --Getting last degree ) 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 --DIV_CDE Level --CE Continuing Education --CT Certificate 1 --DC Doctor of Chiropractic 4 --GR Graduate 3 --PD Pending Division --UG Undegraduate 2 --The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified. 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
1 个评论
在子查询/cte中进行排序是没有意义的。如果你要求你的最终结果集像这样排序,那么你需要把CASE表达式移到你的SELECT子句中,这样你就可以在你的 SELECT * FROM ctedivisiondesc 语句中得到那个编号的排序值。
sql-server
tsql
ERPISE
ERPISE
发布于 2022-04-13
1 个回答
GarethD
GarethD
发布于 2022-04-13
已采纳
0 人赞同

你需要对外部查询进行排序。

对子查询进行排序是不允许的,因为它是没有意义的,请考虑这个简单的例子。

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中再创建一个列来用于排序。

WITH ctedivisiondesc AS
    SELECT *
FROM    (   SELECT  DH1.ID_NUM,
                        DH1.DIV_CDE,
                        DDF.DEGREE_DESC AS DivisionDesc,
                        DTE_DEGR_CONFERRED,
                        ROW_NUMBER() OVER (PARTITION BY ID_NUM ORDER BY DTE_DEGR_CONFERRED DESC) AS [ROW NUMBER],
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
END AS SortOrder
                FROM    TmsePrd.dbo.DEGREE_HISTORY AS DH1
                        INNER JOIN TmsePrd.dbo.DEGREE_DEFINITION AS DDF
                            ON DH1.DEGR_CDE = DDF.DEGREE
            ) AS t
    WHERE   t.[ROW NUMBER] <= 1
SELECT  ID_NUM,
        DIV_CDE,