2014-08-14 3 views
0

Предполагая, что у меня есть эта таблица:Рекурсивной сумма значений в иерархической таблице в Oracle 10g

CREATE TABLE MY_EXAMPLE (ID NUMBER , PARENT NUMBER , VALUE NUMBER); 

Insert into MY_EXAMPLE (ID,PARENT,VALUE) values (1,null,100); 
Insert into MY_EXAMPLE (ID,PARENT,VALUE) values (2,1,50); 
Insert into MY_EXAMPLE (ID,PARENT,VALUE) values (3,null,0); 
Insert into MY_EXAMPLE (ID,PARENT,VALUE) values (4,2,1000); 
Insert into MY_EXAMPLE (ID,PARENT,VALUE) values (5,1,1); 

|id |parent |value | 
|1 |null  |100  | 
|2 |1  |50  | 
|3 |null  |0  | 
|4 |2  |1000 | 
|5 |1  |1  | 

мне нужно создать представление (которое должно хорошо работать) с тем же количеством строк, но дает плюс Ей суммарная стоимость детей. Возможны многие уровни, а также многие дети.

|id |parent |value | 
|1 |null  |1151 | (sum of 1 + 2 + 4 + 5) 
|2 |1  |1050 | (sum of 2 + 4) 
|3 |null  |0  | (only 3 because has no children) 
|4 |2  |1000 | (only 4 because has no children) 
|5 |1  |1  | (only 5 because has no children) 

пса .: Я пытался что-то вроде this, но он не работает в Oracle 10g первого, потому что ключевое слово RECURSIVE не поддерживается, и вторым, потому что он не допустит рекурсивным ("вперед или рекурсивная референцию имя запроса в предложении WITH не допускается ").

Также я не мог найти способ сделать это с помощью CONNECT BY, который включает в себя id и родительские столбцы и дает мне всю таблицу (в моих попытках мне всегда приходилось использовать START WITH).

ответ

0

Вы должны создать рекурсивную функцию:

CREATE FUNCTION RECURSIVE_ADD(
    ROOT_ID IN NUMBER) 
    RETURN NUMBER 
IS 
    TOTAL NUMBER; 
BEGIN 
    SELECT SUM(VALUE) 
    INTO TOTAL 
    FROM (
     (
     SELECT VALUE FROM MY_EXAMPLE WHERE ID = ROOT_ID 
    ) 
    UNION 
     (
      SELECT recursive_add(id) FROM my_example WHERE parent = root_id 
     )); 
    RETURN total; 
END; 

select id, parent, value, RECURSIVE_ADD(id) from my_example; 

Убедитесь, что вы не имеете цикл в ваших данных (например, если установить родительский 1 до 2), иначе это никогда не будет прекратить. Есть и другие способы сделать это в новых версиях Oracle, но это будет работать в 10g.

+0

Я мог бы принять ваш ответ, но, по правде говоря, мне нужна лучшая производительность. Я собираюсь рассчитать и сохранить сумму с помощью триггеров. –