I have a table like the following:
x
ID PARENT_ID VALUE_ID
1 NULL 100
2 1 NULL
3 2 200
4 3 NULL
5 1 300
6 2 NULL
7 6 400
8 7 500
And I’d like to be able to fetch each ID with its corresponding VALUE_ID. I want to do it in such a way that if a row has a VALUE_ID as NULL, it “inherits” the VALUE_ID of the first parent above it in the hierarchy, that has a VALUE_ID as NOT NULL. So that would be the query result:
ID VALUE_ID
1 100
2 100 // -> inherits the value from PARENT_ID = 1;
3 200
4 200 // -> inherits the value from PARENT_ID = 3;
5 300
6 100 // -> inherits the value from ID = 1, because the PARENT_ID = 2 also has VALUE_ID as NULL, so it goes deeper in the hierarchy;
7 400
8 500
Could such a thing be accomplished with only one recursive or hierarchical query? Or be accomplished in general without a procedure, perhaps? With CTE, or CONNECT BY clause?
Advertisement
Answer
You can use a recursive CTE for this:
with cte(id, value_id, parent_value_id) as (
select id, value_id, value_id as parent_value_id
from t
where value_id is not null
union all
select t.id, t.value_id, cte.parent_value_id
from cte join
t
on t.parent_id = cte.id
where t.value_id is null
)
select *
from cte
order by id;
Here is a db<>fiddle.