Возврат родительских / дочерних отношений на самосоединяющейся таблице - PullRequest
1 голос
/ 06 сентября 2010

Мне нужно иметь возможность возвращать список всех дочерних элементов с указанным родительским идентификатором на всех уровнях с использованием SQL.

Таблица выглядит примерно так:

ID   ParentId   Name
---------------------------------------
1    null       Root
2    1          Child of Root
3    2          Child of Child of Root

Give Idиз '1', как бы я вернул весь список ...?Глубина вложения также не ограничена ...

Спасибо,Кирон

1 Ответ

3 голосов
/ 06 сентября 2010

Чтобы получить все дети для данного @ParentId, сохраненного таким образом, вы можете использовать рекурсивный CTE.

declare @ParentId int
--set @ParentId = 1

;WITH T AS
(
select 1 AS ID,null AS ParentId, 'Root' as [Name] union all
select 2,1,'Child of Root' union all
select 3,2,'Child of Child of Root'
),
cte AS
(
SELECT ID, ParentId, Name
FROM T 
WHERE ParentId = @ParentId  OR (ParentId IS NULL AND @ParentId IS NULL)
UNION ALL
SELECT T.ID, T.ParentId, T.Name
FROM T 
JOIN cte c ON c.ID = T.ParentId
)
SELECT ID, ParentId, Name
FROM cte
OPTION (MAXRECURSION 0)
...