Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дерево [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]

Что значит "нижний" и "верхний" элемент?
Ты знаешь "лист" и тебе надо найти "корень"? Ты знаешь "корень" и тебе надо найти все "листья"?


Наверх

Титульная страница Поиск, карта сайта Написать письмо