Повторяющаяся запись с использованием CTE SQL Server 2008 - PullRequest
2 голосов
/ 18 марта 2012

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

У меня есть таблица с именем 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

Кто-нибудь может помочь мне исправить мой запрос? Спасибо

1 Ответ

3 голосов
/ 18 марта 2012

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

AND Task_Seq = 0

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...