Рекурсивное Общее Табличное Выражение (CTE) позволяет быстро пройтись по иерархии родителей / потомков.Этот пример начинается с родителей верхнего уровня, то есть строк, над которыми нет родителей.Затем он добавляет детей по одному уровню за раз, следя за верхним родителем.
-- Sample data.
declare @Samples as Table ( Parent Int, Child Int );
insert into @Samples ( Parent, Child ) values
( 1, 2 ), ( 2, 3 ), ( 3, 4 ), ( 5, 6 ), ( 6, 7 );
select * from @Samples;
-- Run the tree.
with Tree as (
-- Start with the top level parents.
select Parent as TopLevelParent, Child
from @Samples as S
-- Where the row has no parent above it.
where not exists ( select 42 from @Samples as SS where S.Parent = SS.Child )
union all
-- Add the children one level at a time.
select T.TopLevelParent, S.Child
from Tree as T inner join
@Samples as S on S.Parent = T.Child )
-- Display the sorted results.
select TopLevelParent, Child
from Tree
order by TopLevelParent, Child;