Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обход дерева  [new]
FatherSql
Member

Откуда:
Сообщений: 3812
есть таблички. надо выдавать всех потомков указанного узла. Примерный код накидал, но он не работает, пробовал перебором (меняя id и parent) - не получилось. Логику with не понял сколько не вникал. Памахите.
declare @t table(id int, descr varchar(20))
insert @t select 1, 'корень'
insert @t select 2, 'поддерево1'
insert @t select 3, 'поддерево2'
insert @t select 4, 'поддерево3'
insert @t select 5, 'поддерево4'
insert @t select 6, 'поддерево5'
insert @t select 7, 'поддерево6'
insert @t select 8, 'поддерево7'
;

declare @link table(id int, parent int)
insert @t select 2, 1
insert @t select 3, 1
insert @t select 4, 1
insert @t select 5, 1
insert @t select 6, 1
insert @t select 7, 1
insert @t select 8, 3
;

WITH tree (id, parent, level, name) as 
(
   SELECT t.id, parent, 0 as level, descr
   FROM @t t
   join @link l on l.id = t.id
   WHERE l.id = 7

   UNION ALL

   SELECT t.id, l.parent, tree.level + 1, descr
		FROM @t t
		join @link l on l.id = t.id 
     INNER JOIN tree ON tree.id = l.parent
)
SELECT *
FROM tree
10 авг 16, 04:45    [19522905]     Ответить | Цитировать Сообщить модератору
 Re: Обход дерева  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @t table(id int, descr Nvarchar(20))
insert @t select 1, N'корень'
insert @t select 2, N'поддерево1'
insert @t select 3, N'поддерево2'
insert @t select 4, N'поддерево3'
insert @t select 5, N'поддерево4'
insert @t select 6, N'поддерево5'
insert @t select 7, N'поддерево6'
insert @t select 8, N'поддерево7'


declare @link table(id int, parent int)
insert @link select 2, 1
insert @link select 3, 2
insert @link select 4, 1
insert @link select 5, 1
insert @link select 6, 1
insert @link select 7, 1
insert @link select 8, 3
;


 WITH tree (id, parent, level, name) as 
(
   SELECT t.id, l.parent, 0 as level, descr
   FROM @t t
   join @link l on l.id = t.id
  

   UNION ALL

   SELECT t.id, l.parent, level + 1, descr
		FROM @t t
		join @link l on l.id = t.id 
     INNER JOIN tree ON tree.id = l.parent
)
SELECT *
FROM tree
10 авг 16, 05:11    [19522908]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить