2012-03-18 4 views
2

Мне нужно управлять хранением данных иерархии в моей базе данных. Но сейчас у меня проблема. Пожалуйста, смотрите мой примерПовторяющаяся запись с использованием CTE SQL Server 2008

У меня есть таблица под названием COMMON.TASK_REL

enter image description here

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

enter image description here

Я полагаю, нужно сортировать task_seq и возвращать результат как ниже:

Task Name  || Task_Seq 
    Item1    1 
    ..Item1.2   1 
    ...Item1.2.1  1 
    ..Item1.1   2 

Вот мой запрос

--Common task SQL modify -- 
WITH ctLevel 
AS 
(
SELECT 
    C_TASK_ID AS Child 
    ,P_Task_ID AS Parent 
    ,common_task.TASK_SEQ AS taskOrder 
    ,1 AS [Level] 
    ,CAST(C_TASK_ID AS VARCHAR(MAX)) AS [Order] 
    ,CAST (Replicate('.', 1) + common_task.TASK_NAME AS VARCHAR(25)) 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' 
UNION ALL 

SELECT 
    C_TASK_ID AS Child 
    ,P_Task_ID AS Parent 
    ,common_task.TASK_SEQ AS taskOrder 
    ,[Level] + 1 AS [Level] 
    ,[Order] + '.' + CAST(C_TASK_ID AS VARCHAR(MAX)) AS [Order] 
    ,CAST (Replicate('.', [Level] + 1) + common_task.TASK_NAME AS VARCHAR(25)) 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' 
) 

-- Viewing Data 
SELECT Child ,Parent ,taskOrder,Level,[Order],Task_Name 
FROM ctLevel 
GROUP BY Child ,Parent ,taskOrder,Level,[Order],Task_Name 
order by [Order]; 
GO 

Но мой результат возвращается дублированные строки:

enter image description here

Любой человек может помочь мне исправить мой запрос? Спасибо

ответ

3

Я считаю, что ваши дубликаты исходят из вашего запроса root/anchor. Вы должны добавить следующие строки в этом запросе:

AND Task_Seq = 0 

В принципе, вы хотите только корень должен быть создан в начале дерева. 301 | 300 не следует поднимать до рекурсивной секции (часть после union all)

Если это не имеет смысла, я могу отменить ваш запрос с модификацией, но это было ненужным для небольшого изменения.

+0

спасибо:) оно решает – user998405

Смежные вопросы