Для получения рекурсивных данных вы можете использовать рекурсивное общее табличное выражение , например:
DECLARE @DataSource TABLE
(
[parentid] INT
,[childid] INT
,[name] VARCHAR(16)
);
INSERT INTO @DataSource ([parentid], [childid], [name])
VALUES (NULL, 10, 'parent A')
,(10, 11, 'child A1')
,(10, 12, 'child A2')
,(NULL, 13, 'parent B')
,(13, 14, 'sub-parent B1')
,(13, 15, 'sub-parent B2')
,(14, 16, 'child B2 - C1')
,(14, 17, 'child B2 - C2');
WITH RecursiveDataSource AS
(
SELECT *
,1 AS [Level]
,ROW_NUMBER() OVER (ORDER BY(SELECT 1)) AS [FamilyID]
FROM @DataSource
WHERE [parentid] IS NULL
UNION ALL
SELECT DS.*
,RDS.[Level] + 1
,RDS.[FamilyID]
FROM RecursiveDataSource RDS
INNER JOIN @DataSource DS
ON RDS.[childid] = DS.[parentid]
)
SELECT *
FROM RecursiveDataSource
ORDER BY [FamilyID]
,[Level];
Затем используйте этистолбцы вы можете оживить данные по желанию.