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

Откуда: Донецк
Сообщений: 268
Приветствую
Есть таблица упрощенно сводящаяся к структуре
tree_sample(
id,
pid,
name)

Нужно зная один из id входящий в дерево (он может быть вверху в средине или внизу дерева) выбрать все строки таблицы содержащие это дерево
Пока могу выбирать узлы нижестоящие от указанного, но как делать проход и сверху и снизу не могу понять.

with tree (id, pid, level)
as (select id,pid, 0,
from tree_sample
where id=@SerchRec
union all
select tree_sample.id, tree_sample.pid, t.level + 1
from tree_sample
inner join tree on tree.id = tree_sample.pid)

select * from tree

Подскажите как получить все строки которые входят в дерево содержащее в себе узел с id=SerchRec

Григорий
15 мар 16, 11:26    [18932369]     Ответить | Цитировать Сообщить модератору
 Re: Выбор всех узлов дерева по узлу входящему в дерево.  [new]
Glory
Member

Откуда:
Сообщений: 104751
gr_vl
Подскажите как получить все строки которые входят в дерево содержащее в себе узел с id=SerchRec

сделать 2 рекурсивных запроса
один - от этого узла вверх по иерархии
второй - от этого узла вниз по иерархии
15 мар 16, 11:30    [18932391]     Ответить | Цитировать Сообщить модератору
 Re: Выбор всех узлов дерева по узлу входящему в дерево.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21494
Если рассматривается вариант изменения структуры хранения - лучше задействовать его. Как минимум - добавит поле полного материализованного пути, как максимум - перейти на специально заточенные под хранение дерева структуры (nested set, например).

Если не рассматривается - то аналогично имеющемуся запросу составьте запрос, который не опускается по дереву, а поднимается по нему до корня, и объедините выборки.
15 мар 16, 11:32    [18932412]     Ответить | Цитировать Сообщить модератору
 Re: Выбор всех узлов дерева по узлу входящему в дерево.  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Может, так (не проверял)?
with
tree_down(id, pid, level)as
(
 select id,pid,0
 from tree_sample
 where id=@SerchRec
 union all
 select tree_sample.id, tree_sample.pid, tree_down.level + 1
 from tree_sample 
 join tree_down on tree_down.id = tree_sample.pid
) 
,tree_up(id, pid, level)as
(
 select id,pid,0
 from tree_sample
 where id=@SerchRec
 union all
 select tree_sample.id, tree_sample.pid, tree_up.level - 1
 from tree_sample 
 join tree_up on tree_up.pid = tree_sample.id
) 
select * from tree_down
union all
select * from tree_up
15 мар 16, 11:39    [18932471]     Ответить | Цитировать Сообщить модератору
 Re: Выбор всех узлов дерева по узлу входящему в дерево.  [new]
gr_vl
Member

Откуда: Донецк
Сообщений: 268
Akina,

К сожелению структуру таблиц поменять не могу.

Обход вверх и вниз по отдельности сделал но как объеденить 2 СЕT (те 2 with запроса) не могу понять в одном я иду вниз в другом вверх или как можно обойтись одним?
15 мар 16, 11:44    [18932516]     Ответить | Цитировать Сообщить модератору
 Re: Выбор всех узлов дерева по узлу входящему в дерево.  [new]
gr_vl
Member

Откуда: Донецк
Сообщений: 268
gr_vl,

Пока отвечал на предыдущий пост уже получил ответ.
Спасибо
буду пробовать
15 мар 16, 11:45    [18932525]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить