Форум: "Базы";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизНарод подскажите! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c