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

Откуда:
Сообщений: 40
Кратко опишу исходные данные:
Есть таблица с описаниям объектов дерева, например Obj (id_obj, description, id_Objtype), и есть таблица описывающая связи в дереве. вида Tree_Link (id_link, id_parent, id_child) уровней в дереве от корня до листа может быть неограниченное количество. Может кто поможет с алгоритмом такого запроса который даст всех детей конкретного объекта (включая детей детей и т.д.)?. НО есть ограничения, так нет возможности использовать циклы, хранимые процедуры. (ограничения програаммы из которая обращается к СУБД). Вот ткая с виду не тривиальная задача, а уже второй день не могу придумать корректного алгоритма её решения.
14 май 12, 10:08    [12548187]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
qwerty112
Guest
kominet
Кратко опишу исходные данные:
Есть таблица с описаниям объектов дерева, например Obj (id_obj, description, id_Objtype), и есть таблица описывающая связи в дереве. вида Tree_Link (id_link, id_parent, id_child) уровней в дереве от корня до листа может быть неограниченное количество.

вообще-то, такая структура описывает направленный граф ... для "дерева" - она избыточна, достаточно было бы одной таблицы..
так, что всё-таки - это граф (и один чайлд, может иметь несколько перент) или дерево ?
kominet
Может кто поможет с алгоритмом такого запроса который даст всех детей конкретного объекта (включая детей детей и т.д.)?. НО есть ограничения, так нет возможности использовать циклы, хранимые процедуры. (ограничения програаммы из которая обращается к СУБД). Вот ткая с виду не тривиальная задача, а уже второй день не могу придумать корректного алгоритма её решения.

канэшна :)

нуу ты ж тоже поможеш, да ?
Рекомендации по оформлению сообщений в форуме
п.4 и п.6 - выучи наизусть
14 май 12, 10:20    [12548242]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
kominet,
declare @id int
set @id="значение"

with cte as (
  select * from Tree_Link where id_child=@id
  union all
  select b.* from cte a
    inner join Tree_Link b on b.id_parent=a.id_child
)
select * from cte


получите детей для указанного id_child
14 май 12, 10:28    [12548278]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
kominet
Member

Откуда:
Сообщений: 40
qwerty112
вообще-то, такая структура описывает направленный граф ... для "дерева" - она избыточна, достаточно было бы одной таблицы..
так, что всё-таки - это граф (и один чайлд, может иметь несколько перент) или дерево ?
нуу ты ж тоже поможеш, да ?
Рекомендации по оформлению сообщений в форуме
п.4 и п.6 - выучи наизусть

Версия СУБД
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86) Apr 2 2010 15:53:02 Copyright (c) Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
К базе обращается программа Lotsia PDM (это САПР и поэтому маловероятно что это чем то полезная информация), БД создаётся программой и менять её структуру невозможно (с сохранением работоспособности клиенсткой части).
P.S. Мне бы даже не сам SQL запрос нужен, а просто алгоритм, с учётом тех ограничений которые описаны выше.
14 май 12, 11:32    [12548722]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
kominet
Member

Откуда:
Сообщений: 40
Matroskin, К сожалению нет возможности использовать переменные. Запрос должен быть простым SELECT, максимум что доступно Union и Intersect
14 май 12, 11:34    [12548738]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
kominet,

так параметр то можете передать ?
14 май 12, 12:00    [12548933]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
Matroskin,

без рекурсии подобная задача не решается, ИМХО
14 май 12, 12:06    [12548970]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Сделать вьюху, положить в нее запрос Matroskin'a - только корневой уровень CTE переписать, чтобы брал все корневые объекты. С NOT EXISTS, надеюсь, справитесь сами.

Переключить вашу прогу на использование оной вьюхи, скорее всего реально будет сделать. В крайнем случае курить доку по CREATE SYNONYM.
14 май 12, 12:19    [12549053]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
kominet
Member

Откуда:
Сообщений: 40
Ennor Tiegael, В запросе я могу использовать любое представление из базы, поэтому с этим проблемм нет, и собственно это и было первым решением данной задачи, но при обновлении программы (а обновления от разработчика выходят достаточно часто) при переразметке БД (которая является обязательной частью обновления) появляется ругань на "свои" таблицы и представления (так же как и на процедуры и на функции). По средством их ручного удаления а потом добавления в переразмеченную БД проблемма решается, но это костыль, от которого и хотелось бы избавиться. Ещё в службе поддержки разработчика подсказали что выбрать всех детей можно на MS SQL не ниже 8 (как меня как раз не ниже), а на 2005 - никак.
14 май 12, 13:20    [12549618]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
kominet,

Херню они вам сказали. CTE появились в 2005 версии сиквела, это как раз до нее (т.е. 2000 он же 8.0 и раньше) такое в один запрос не решалось.

Если вам лень чистить БД от своих объектов при каждом выходе обновления и потом восстанавливать их обратно, то задача нерешаема.
14 май 12, 17:15    [12551961]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
kominet,

Вынести, если возможно, все "свои" объекты в отдельную БД.
14 май 12, 17:40    [12552230]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для работы с "деревом"  [new]
Aleksey V.P.
Member

Откуда: Москва
Сообщений: 575
invm
kominet,

Вынести, если возможно, все "свои" объекты в отдельную БД.


Или в отдельную схему.
15 май 12, 10:03    [12554282]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить