【问题标题】:sorting the Hierarchical table like 1.1.1对分层表进行排序,如 1.1.1
【发布时间】:2023-03-19 04:06:01
【问题描述】:

我正在使用 CTE 来管理我的层次结构数据。以下是我的选择查询

 WITH ctLevel
                AS
                (
                    SELECT
                        C_TASK_ID                                                               AS Child
                        ,P_Task_ID                                                              AS Parent
                        ,common_task.   TASK_SEQ                                                AS taskSeq
                        ,1                                                                      AS [Level]
                        ,CAST( TASK_SEQ AS VARCHAR(MAX))                                        AS [taskOrder]
                        ,CAST (Replicate(TASK_SEQ,  1)+' '+ TASK_NAME  AS VARCHAR(MAX))  AS [Task_Name]
                        ,common_task.TASK_POSITION                                              AS [TASK_POSITION]
                    FROM   
                        [COMMON.TASK_REL] as common_task_rel, 
                        [COMMON.TASK] as common_task
                    WHERE  
                        common_task_rel.C_TASK_ID = common_task.TASK_ID
                        and     common_task.[TASK_TYPE] = 'F' AND common_task.[MODULE_CODE] ='PRODE' AND common_task.[STATUS] <> 'D'
                        and     common_task_rel.P_TASK_ID is null

                    UNION ALL

                    SELECT 
                        C_TASK_ID                                                                   AS Child
                        ,P_Task_ID                                                                  AS Parent
                        ,common_task.   TASK_SEQ                                                    AS taskSeq
                        ,[Level] + 1                                                                AS [Level]
                        ,[taskOrder] + '.' + CAST(TASK_SEQ AS VARCHAR(MAX))                         AS [taskOrder]
                          ,CAST (Replicate('&nbsp;&nbsp;&nbsp;', [Level] + 1) + taskOrder + '.' + CAST(TASK_SEQ AS VARCHAR(MAX))+' ' +common_task.TASK_NAME AS VARCHAR(MAX))  AS [Task_Name]
                        ,common_task.TASK_POSITION                                              AS [TASK_POSITION]
                    FROM   
                        [COMMON.TASK_REL]as common_task_rel
                    INNER JOIN 
                        ctLevel
                    ON 
                        ( P_Task_ID = Child ) ,
                        [COMMON.TASK] as common_task

                    WHERE  
                            common_task_rel.C_TASK_ID = common_task.TASK_ID
                    and     common_task.[TASK_TYPE] = 'F' AND common_task.[MODULE_CODE] = 'PRODE' AND common_task.[STATUS] <> 'D'
                    )

                   SELECT [Parent] ,[Child],taskSeq, Level,[taskOrder],Task_Name,[TASK_POSITION]
                    FROM   ctLevel  
                    order by [taskOrder],[Level],[TASK_POSITION]

我的结果如何:

你可以参考这个例子。
10 10.1 10.1.1 10.1.1.1假设会在9的底部

是否可以像下面这样对这些记录进行排序

1
2
2.1
2.2
2.4
2.5
2.6
2.7
3
3.1
3.2
4
4.1
4.2
5
5.1
6
6.1
6.2
6.3
6.4
6.5
7
8
9
9.1
9.1
9.1.1
9.1.1.1
9.1.1.2
9.1.1.3
9.1.1.4

10
10.1
10.1.1
10.1.1.1

提前致谢。

【问题讨论】:

  • 由于数据在排序时将被视为文本,因此您需要确保每个部分(在您的 . 之间)使用相同数量的字符。 1 需要表示为 01 才能使您的排序正确。

标签: asp.net sql-server sorting select common-table-expression


【解决方案1】:

格式化数字如001,例如:

right('000' + convert(varchar(max), [Level] + 1),3)

【讨论】:

    【解决方案2】:

    对于 SQL2008+

    您可以生成 hierarchyid 值,而不是生成 Num1.Num2.Num3... 值,这些值可以轻松地按 ASC 或 DESC 排序。当您将 VARCHAR 值转换为 HIERARCHYID 数据类型时,您必须遵循以下语法:/Num1/Num2/Num3/:

    SELECT *, CONVERT(VARCHAR(50), T.A) AS VarCharHI, T.A.GetLevel()
    FROM (VALUES
            ( CONVERT(HIERARCHYID, '/1/') , 'A' ),
            ( CONVERT(HIERARCHYID, '/2/11/1/1/1/') , 'C' ),
            ( CONVERT(HIERARCHYID, '/40/11/1/') , 'D' ),
            ( CONVERT(HIERARCHYID, '/5/11/') , 'D' ),
            ( CONVERT(HIERARCHYID, '/2/2/') , 'B' ) ) AS T(A,B)
    ORDER BY T.A ASC;
    

    结果:

    A           B    VarCharHI                                          GetLevel()
    ----------- ---- -------------------------------------------------- ----------
    0x58        A    /1/                                                1
    0x6B40      B    /2/2/                                              2
    0x6D75AD60  C    /2/11/1/1/1/                                       5
    0x8EB8      D    /5/11/                                             2
    0xCB1AEB    D    /40/11/1/                                          3
    

    我会做出以下改变:

    WITH ctBaseLevel
    AS
    (
    ...
    ,'/' + CAST( TASK_SEQ AS VARCHAR(MAX)) + '/' AS [taskOrder]
    ...
    UNION ALL
    ...
    ,[taskOrder] + CAST(TASK_SEQ AS VARCHAR(MAX)) + '/'
    ...
    ) , ctLevel
    AS
    (
    SELECT l.*, CONVERT(HIERARCHYID, l.[taskOrder]) AS  [taskOrder_HIERARCHYID]
    FROM ctBaseLevel l
    )
    SELECT * FROM cteLevel ORDER BY [taskOrder_HIERARCHYID];
    

    【讨论】:

    • 感谢您的解决方案。此查询在 sql server 2005 上有效吗?
    • 在 SQL Server 2008 中引入了 hierarchyid 数据类型。
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多