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

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

Вопрос о деревьях [D5, D6, MSSQL]


dim- ©   (2002-08-22 23:48:00) 

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


Hro   (2002-08-23 10:31:00) [1]

Добавь во временную таблицу еще и поле bos, а при выводе индексируй по нему


SergSuper   (2002-08-23 10:27:00) [2]

Можно посмотреть здесь
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=5659
или здесь
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=10197
или здесь
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=1701

Но в принципе это несложная задача и если человек работает с БД он должен её решать сам


dim-   (2002-08-23 10:21:00) [3]

Спасибо, это работает, но оно выдает всех потомков просто скопом, а как можно сформировать их в виде иерархии для отчета, т.е.:
id родитель1
id дети1
id дети1
id родитель2
id дети2
id дети2
....


wicked   (2002-08-23 00:05:00) [4]

помогу обьяснением "на пальцАх", так как над темой немного размышлял... :)
создаём хранимую процедуру, которая должна будет выбирать во временную табличку id тех элементов, поле bos которых будет указывать на заданный родительский элемент... например

insert #temp_table (id)
select id from tbl where bos = @id

где @id - id заданного родительского элемента...
затем повторяем запрос вида

insert #temp_table (id)
select id from tbl t
where exists (select id from #temp_table t2 where t2.id = t.bos)
and not exists (select id from #temp_table t2 where t.id = t2.id)

до тех пор, пока @@rowcount не будет равным 0 (я опираюсь на то, что ты указал mssql)...
то есть, в общем это будет вылядеть примерно так

create proc get_all_children @id int
as begin
set nocount on -- спорно, надо глянуть,
-- будет ли срабатывать @@rowcount
set ansi_warnings off

insert #temp_table (id)
select id from tbl where bos = @id
while @@rowcount <> 0
insert #temp_table (id)
select id from tbl t
where exists (select id from #temp_table t2
where t2.id = t.bos)
and not exists (select id from #temp_table t2
where t.id = t2.id)
end

в общих чертах так.... за замеченные ошибки (логические) просьба ногами не пинать - больно... :)


Наверх

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