Если у вас иерархическая структура и задача могут иметь родителя, а родитель - дочерний объект для другой задачи, yo может использовать рекурсивный CTE для поиска всей иерархии заданной задачи.
Позвольте мне привести пример.
Вы получили структуру, как это:
SELECT *
FROM (VALUES
(1,'Title1','Do some stuff 1', 0, NULL),
(2,'Title2','Do some stuff 2', 0, NULL),
(3,'Title3','Do some stuff 3', 1, 1),
(4,'Title4','Do some stuff 4', 1, 1),
(5,'Title5','Do some stuff 5', 0, 2),
(6,'Title6','Do some stuff 6', 1, 2),
(7,'Title7','Do some stuff 7', 0, 4),
(8,'Title8','Do some stuff 8', 0, NULL)
) as t([id],[title],[description],[complete],[DependsOnTask])
Так задача 1 имеет 2 дочерние задачи - 3 и 4. четвёртая задача получил 1 ребенок - 7. Вы хотите, чтобы все дочерние задачи задачи с id = 1
:
DECLARE @taskid int = 1
;WITH cte AS (
SELECT [id]
,[title]
,[description]
,[complete]
,[DependsOnTask]
FROM [ToDoItems]
WHERE [id] = @taskid
UNION ALL
SELECT t.*
FROM [ToDoItems] t
INNER JOIN cte c
ON c.id = t.DependsOnTask
)
SELECT *
FROM cte
Выход:
id title description complete DependsOnTask
1 Title1 Do some stuff 1 0 NULL
3 Title3 Do some stuff 3 1 1
4 Title4 Do some stuff 4 1 1
7 Title7 Do some stuff 7 0 4
Так что если вы измените последний выбор на:
SELECT @taskid as main,
id,
DependsOnTask
FROM cte
Вы получите:
main id DependsOnTask
1 1 NULL
1 3 1
1 4 1
1 7 4
Таким образом, вы получите все дочерние задачи Task1
.
Если вы измените КТР, как это:
;WITH cte AS (
SELECT [id]
,[title]
,[description]
,[complete]
,[DependsOnTask]
,[id] as Parent
FROM [ToDoItems]
WHERE [DependsOnTask] IS NULL
UNION ALL
SELECT t.*,
c.Parent
FROM [ToDoItems] t
INNER JOIN cte c
ON c.id = t.DependsOnTask
)
SELECT Parent,
id,
DependsOnTask
FROM cte
Вы получили все, что вам нужно: Родитель задачи, задачи по уходу за детьми и что они зависят от:
Parent id DependsOnTask
1 1 NULL
2 2 NULL
8 8 NULL
2 5 2
2 6 2
1 3 1
1 4 1
1 7 4
Это плохая практика использования 'master' для пользовательских таблиц. Просто заметьте! :) – gofr1
Я знаю это, но это не производственный код :) –