сортировка иерархической таблицы с использованием общего табличного выражения - PullRequest
0 голосов
/ 19 марта 2012

Я застреваю при сортировке иерархической таблицы с использованием общего табличного выражения.Пожалуйста, посмотрите мой образец. У меня есть таблица с именем COMMON.TASK_REL

enter image description here

Моя вторая таблица называется Common.task enter image description here

Мой SQL-запрос

                WITH ctLevel
                AS
                (
                    SELECT  
                        C_TASK_ID                                                               AS Child
                        ,P_Task_ID                                                              AS Parent
                        ,common_task.   TASK_SEQ                                                AS taskSeq
                        ,1                                                                      AS [Level]
                        ,CAST(C_TASK_ID AS VARCHAR(MAX))                                        AS [Order]
                        ,CAST (Replicate(' ', 1) + common_task.TASK_NAME AS VARCHAR(MAX))       AS [Task_Name]
                    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] = 'B' AND common_task.[MODULE_CODE] = 'LWRPT' 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]
                        ,[Order] + '.' + CAST(C_TASK_ID AS VARCHAR(MAX))                            AS [Order]
                        ,CAST (Replicate(' ', [Level] + 1) + common_task.TASK_NAME AS VARCHAR(MAX))  AS [Task_Name]
                    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] = 'B' AND common_task.[MODULE_CODE] = 'LWRPT' AND common_task.[STATUS] <> 'D'
                    )


                    SELECT [Parent] ,[Child],taskSeq, Level,[Order],[Task_Name]as taskName
                    FROM   ctLevel  
                    order by [Order]

Мой sql результат

enter image description here

Здесь я получил вопрос.Как мне отсортировать taskseq , чтобы получить результат, подобный приведенному ниже

taskName      taskSeq
-Item1          1
--Item 1.1      1
--Item 1.2      2
--Item 1.3      3
-item 3         2
-Item 2         3
--Item 2.1      1
--Item 2.2      2
--Item 2.3
---Item 2.3.1

1 Ответ

1 голос
/ 19 марта 2012

Мне кажется, что вы хотите упорядочить по taskSeq, но у детей разные значения.Чтобы решить эту проблему, нужно ввести другое поле, которое будет реплицировать значение из родительского элемента всем его дочерним элементам:

WITH ctLevel
AS
(
SELECT  
    C_TASK_ID                                                               AS Child
    ,P_Task_ID                                                              AS Parent
    ,common_task.TASK_SEQ                                                   AS taskSeq
    ,common_task.TASK_SEQ AS sorting_field
    ,1                                                                      AS [Level]
    ,CAST(C_TASK_ID AS VARCHAR(MAX))                                        AS [Order]
    ,CAST (Replicate(' ', 1) + common_task.TASK_NAME AS VARCHAR(MAX))       AS [Task_Name]
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] = 'B' AND common_task.[MODULE_CODE] = 'LWRPT' 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
    ,ctLevel.sorting_field
    ,[Level] + 1                                                                AS [Level]
    ,[Order] + '.' + CAST(C_TASK_ID AS VARCHAR(MAX))                            AS [Order]
    ,CAST (Replicate(' ', [Level] + 1) + common_task.TASK_NAME AS VARCHAR(MAX)) AS [Task_Name]
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] = 'B' AND common_task.[MODULE_CODE] = 'LWRPT' AND common_task.[STATUS] <> 'D'
)

SELECT [Parent] ,[Child],taskSeq, Level,[Order],[Task_Name]as taskName
FROM   ctLevel  
order by sorting_field, [Order]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...