Суммирование в дереве

 
0
 
Oracle
ava
guest | 20.02.2005, 11:37
:stena
Всем привет!
В данный момент решаю одну задачу на PL/SQL. Задача такая:
есть некая иерархическая структура - дерево, для каждого узла которого с помощью некоторой функции можно получить целое число. Нужно провести суммирование этих чисел в дереве так, чтобы в узле оказалась сумма всех его подузлов. Как это можно сделать используя одни лишь структурированные запросы и не используя дополнительных таблиц и рекурсивных функций?

Простой пример:
Начальная структура:

5
|
6-3
| |
7 6
|
1-3
|
3

После суммирования:

34
|
29-9
| |
14 6
|
7-6
|
3

Проблема в том, что значения в узлах не хранятся, а вычисляются.
Кто знает, подсобите smile Хотя какие-нибудь наводящие мысли(имена функций, операторов и т.д.).
Заранее спасибо.
Comments (1)
ava
LSD | 24.02.2005, 20:53 #
Честно говоря я не совсем понял как вычисляются значения в этом примере.
Можно получить путь от узла до вершины:

-- Создание таблицы
create table TEST_TREE
(
ID raw(16) not null,
PARENT_ID raw(16),
VALUE number
);
-- Создание ключей
alter table TEST_TREE
add constraint PK_TEST_TREE primary key (ID);
alter table TEST_TREE
add constraint FK_TEST_TREE foreign key (PARENT_ID)
references TEST_TREE (ID);

insert into TEST_TREE values(sys_guid(), null, 1);
insert into TEST_TREE values(sys_guid(), null, 2);
insert into TEST_TREE values(sys_guid(), null, 3);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 1), 11);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 1), 12);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 1), 13);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 2), 21);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 2), 22);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 2), 23);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 3), 31);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 3), 32);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 3), 33);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 12),121);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 12),122);
insert into TEST_TREE values(sys_guid(), (select ID from TEST_TREE where VALUE = 12),123);
commit;

select SYS_CONNECT_BY_PATH(TO_CHAR(VALUE), '/')
from TEST_TREE
connect by prior ID = PARENT_ID
start with PARENT_ID is null;

Таким образом мы получим путь от узла до вершины, а там можно по этому пути производить вычисления.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  guest ava  LSD
advanced
Submit