Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Суммирование в дереве 
:(
    Опции темы
Гость_Tanya
Дата 20.2.2005, 11:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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

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

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

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

Проблема в том, что значения в узлах не хранятся, а вычисляются.
Кто знает, подсобите smile Хотя какие-нибудь наводящие мысли(имена функций, операторов и т.д.).
Заранее спасибо.

  Вверх
LSD
Дата 24.2.2005, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Честно говоря я не совсем понял как вычисляются значения в этом примере.
Можно получить путь от узла до вершины:
Код

-- Создание таблицы
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;

Таким образом мы получим путь от узла до вершины, а там можно по этому пути производить вычисления.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.