Рассмотрим следующую таблицу:
create table t1 ( child char(3), parent char(3))
go
insert into t1 values ( '101', '102')
insert into t1 values ( '102', '103')
insert into t1 values ( '103', '104')
go
В следующем запросе используется самообращенная ссылка Общее выражение таблицы для навигации по отношениям и построения дерева, таблица «x».Для каждого дочернего элемента запрос находит максимальную глубину и возвращает дочерние и родительские значения
with x ( tree, child, parent, depth)
as
(
select
cast(child as varchar(100)),
child,
parent,
0
from
t1
union all
select
cast (x.tree + ':' + t1.child as varchar(100)),
x.child,
t1.parent,
x.depth + 1
from
t1,
x
where
x.parent = t1.child
)
select
x1.child,
x1.parent
from
x x1
where
x1.depth =
(
select max(x2.depth) from x x2 where x1.child = x2.child
)
order by x1.child
. Добавление следующих значений показывает, что это работает, как и ожидалось, когда родительский элемент имеет также меньшее значение, чем дочерний.
insert into t1 values ( '120', '110')
insert into t1 values ( '125', '124')
insert into t1 values ( '124', '123')
insert into t1 values ( '123', '110')
go
Результаты:
child parent
----- ------
101 104
102 104
103 104
120 110
123 110
124 110
125 110