階層構造を持ち、タスクが親を持ち、その親が別のタスクの子である場合、再帰的なCTEを使用して、決定されたタスクのすべての階層を見つけることができます。
例を示しましょう。
あなたは、このような構造を持って:だからタスク1が2つのタスクがある
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子を持って3と4を - 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
のすべての子タスクを取得します。
あなたはこのよう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
私はこれを知っているが、それは生産コードではない:) –