Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.013 c
1-28823
158963
2003-02-02 14:17
2003.02.10
Обработака строки


1-28828
158963
2003-02-02 17:44
2003.02.10
I need help. please


1-28722
LongIsland
2003-01-31 16:19
2003.02.10
Динамические массивы


1-28878
anbezr
2003-01-30 14:35
2003.02.10
фсё то же перечисление


1-28833
qweqewqe
2003-02-02 18:06
2003.02.10
Ошибка в Delphi?




   Наверх