Вот еще один вариант использования предложения SQL MODEL.Я использовал некоторые подсказки из того, что Винсент сделал в своем ответе (использование regexp_subsr), чтобы упростить мой код.
Первая часть, в предложении WITH, просто перенастраивает данные и извлекает иерархию на каждом уровне.
Предложение модели в конце запроса выводит данные с самых низких уровней.Для этого потребуется добавить дополнительные столбцы, если имеется более четырех уровней, но они должны работать независимо от того, на каком уровне находятся значения.
Я не совсем уверен, что это будет работать при любых обстоятельствах, поскольку я некоторый имел дело с предложением MODEL, но, по крайней мере, в этом случае он работает.
with my_hierarchy_data as (
select
element,
value,
path,
parent,
lvl0,
regexp_substr(path, '[^/]+', 1, 2) as lvl1,
regexp_substr(path, '[^/]+', 1, 3) as lvl2,
regexp_substr(path, '[^/]+', 1, 4) as lvl3
from (
select
element,
value,
parent,
sys_connect_by_path(element, '/') as path,
connect_by_root element as lvl0
from
tree
left outer join data using (element)
start with parent is null
connect by prior element = parent
order siblings by element
)
)
select
element,
value,
path,
parent,
new_value,
lvl0,
lvl1,
lvl2,
lvl3
from my_hierarchy_data
model
return all rows
partition by (lvl0)
dimension by (lvl1, lvl2, lvl3)
measures(element, parent, value, value as new_value, path)
rules sequential order (
new_value[lvl1, lvl2, null] = sum(value)[cv(lvl1), cv(lvl2), lvl3 is not null],
new_value[lvl1, null, null] = sum(new_value)[cv(lvl1), lvl2 is not null, null],
new_value[null, null, null] = sum(new_value)[lvl1 is not null, null, null]
)
Вы можете использовать оператор вставки:
INSERT INTO data (elelment, value)
select element, newvalue
from <the_query>
where value is null;