![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дерево [D7, MSSQL]
Рафик © (2005-11-25 12:34:00)Уменя есть табличка из двух полей
ID ParentId
Как мне получить все дерево одним запросом, т.е. я знаю нижний элемент а мне нужно получить верхний элемент!!!
Ega23 (2005-11-29 12:55:00) [1]
> иерархию подразделений в организации.
Я никогда не поверю, что глубина вложенности подразделений в этой организации будет больше 32 уровней.
Солдат
Отделение
Взвод
Рота
Батальон
Полк
Дивизия
Округ
Вооружённые силы.
Всего 9 уровней.
svd (2005-11-29 12:49:00) [2]
> Уменя есть табличка из двух полей
> ID ParentId
> Как мне получить все дерево одним запросом, т.е. я знаю
> нижний элемент а мне нужно получить верхний элемент!!!
У меня была аналогичная ситуация, когда надо было построить иерархию подразделений в организации. Запросом это сделать вряд ли можно, а вот хранимой процедурой запросто. Вместо рекурсии (ограниченной 32 уровнями) можно использовать цикл и 3 временные таблицы. В первой накапливаются записи для вывода в результат, а во второй и третьей - записи, соответствующие текущему уровню. На каждом шаге цикла содержимое второй таблицы переписывается в первую и третью, вторая очищается, после чего во вторую таблицу выбираются записи, подчиненные тем, что находятся сейчас в третьей, потом третья очищается . Цикл повторяется до тех пор, пока во вторую таблицу будет выбрана хотя бы 1 запись.
Если описал не совсем понятно - пишите, пришлю исходник процедуры.
Nikolay M. (2005-11-25 13:31:00) [3]
> Ega23 © (25.11.05 13:29) [12]
И я про конкретные. Видел в одном банке воплощение это кошмара на оракле.
Ega23 (2005-11-25 13:29:00) [4]
> 32 уровня вложенности? Легко.
Ну я же не про абстрактные решения любых задач, а про вполне конкретные...
Nikolay M. (2005-11-25 13:27:00) [5]
> Ega23 © (25.11.05 13:14) [10]
Тут неоднократно возникала гениальная мысль по хранению информации в таблице вида (ID, ParentID, ParameterName, ParameterValue). Действительно, сохранить можно почти все, что душа пожелает. 32 уровня вложенности? Легко.
Ega23 (2005-11-25 13:14:00) [6]
> Для MS SQL 2000 - только 32 уровня вложенности. Да и циклом
> это делается намного проще.
Кстати, при длительных раздумьях так и не сумел придумать задачи, где эти 32 уровня будут перекрыты
Nikolay M. (2005-11-25 13:10:00) [7]
> msguns © (25.11.05 13:03) [6]
> Рекурсия ?
Для MS SQL 2000 - только 32 уровня вложенности. Да и циклом это делается намного проще.
Nikolay M. (2005-11-25 13:09:00) [8]А поискать?
http://www.sql.ru/forum/actualtopics.aspx?search=%E4%E5%F0%E5%E2%EE&bid=1
Рафик (2005-11-25 13:08:00) [9]Нет не обязательно null, там есть еще один параметр поле par и вот если этот парметр равен 1 то это корень!!!
msguns (2005-11-25 13:03:00) [10]Рекурсия ?
Ega23 (2005-11-25 12:59:00) [11]
> Значит это невозможно сделать
Почему? В мире нет ничего невозможного!
По твоему условию, корнем является тот, у кого ParentID=NULL?
Если так - то через ХП элементарно делается.
Рафик (2005-11-25 12:56:00) [12]Значит это невозможно сделать
Рафик (2005-11-25 12:40:00) [13]Я знаю лист мне надо найти корень!
Reindeer Moss Eater (2005-11-25 12:38:00) [14]А нет разницы что там ему надо найти.
Все равно древовидные запросы в MSSQL не поддерживаются.
T-SQL надо использовать.
Ega23 (2005-11-25 12:36:00) [15]Что значит "нижний" и "верхний" элемент?
Ты знаешь "лист" и тебе надо найти "корень"? Ты знаешь "корень" и тебе надо найти все "листья"?