Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.10;
Скачать: CL | DM;

Вниз

Народ подскажите!   Найти похожие ветки 

 
River   (2003-01-22 14:50) [0]

есть табличка подразделений
create table division
(
division_id number not null,
division_name varchar2(100),
division_parent_id number
);
alter table division
add costraint pk_division_id primary key (division_id);
alter table division
add constraint fk_division_parent_id foreign key (division_parent_id)
references division (division_id);

ну и вот добавляем туды записи, к примеру у нас есть такая иерархия подразделений:
НБРК
- Центральный Аппарат
- Департамент Монетарных Операций
- Управление 1
- Управление 2
- Департамент Информационных Технологий
- Управление 3
- Управление 4
ККБ
- Центральный Аппарат

в нашей табличке мы их вписываем так:
division_id division_name division_parent_id
1 НБРК
2 Центральный Аппарат 1
3 Департамент Монетарных Операций 2
4 Департамент Информационных Технологий 2
5 Управление 1 3
6 Управление 2 3
7 Управление 3 4
8 Управление 4 4
9 ККБ
10 Центральный Аппарат 9

т.о. мы прослеживаем иерархию, хотя иерархия может быть очень глубокой, но это не суть важно
теперь я хочу вытащить подразделения ко-е входят в состав НБРК, заметь, что структура внутри может меняться. Приходится писать функцию, ко-я проверяет входит ли очередное подразделение в состав нужного и т.д.
select *
from division a
where is_division_in_my_division(a.division_id, 1/*номер подразделения НБРК*/) = true
такой запрос выполняется очень долго, если таблица большая, поскольку на каждой записи происходит вызов функции, в свою очередь функция лезет в эту же таблицу. Долго очень! :-(
на оракле это просто:
select *
from division
connect by prior division_id = division_parent_id
start with division_id = 1
удобно и быстро.
может есть какие-нибудь команжды в Interbase для этих целей?


 
River   (2003-01-22 16:20) [1]

подскажите кто нить?*


 
Max Zyuzin ©   (2003-01-22 17:13) [2]

Я сам не занимался подобными приколами... но на сайте королевства есть статейка...
http://www.delphikingdom.com/helloworld/dbtreeview.htm
Может она тебе поможет.


 
Sergey Masloff   (2003-01-22 23:17) [3]

спец. функций типа connect by нету. Пиши рекурсивную процедуру... По скорости нормально будет.


 
Jeer ©   (2003-01-22 23:38) [4]

Если допустимо вытаскивать часть логики на клиента, то можно заносить инфу в TTreeView и делать рекурсивный обход, начиная с node i.
Получив список id, далее:
where id in (...)


 
Sergey13 ©   (2003-01-23 11:36) [5]

Если головных узлов много, то можно попробовать добавить еще одно поле со ссылкой на "головного" родителя, и тем существенно сузить поиск детей.



Страницы: 1 вся ветка

Текущий архив: 2003.02.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
7-29131
Kuzia
2002-11-26 13:21
2003.02.10
Как написать Сервис


14-29026
Navigor
2003-01-23 16:02
2003.02.10
Как String to Integer Сделать


7-29134
MSAlex
2002-12-08 15:00
2003.02.10
Floppy


14-29007
ATLAS
2003-01-25 16:22
2003.02.10
Win32 API декларирование


7-29129
Igor B.
2002-12-06 19:49
2003.02.10
COM/LPT-порты