Следующий запрос показывает желаемый результат, протестированный на Oracle 12c:
with
x (id, parent, origin, generation) as (
select id, parent, id, 1 from my_table where parent is null
union all
select t.id, t.parent, x.origin, x.generation + 1
from my_table t
join x on t.parent = x.id
),
y (id, parent, generation, origin, rn) as (
select id, parent, generation, origin,
row_number() over(partition by origin order by generation desc) as rn
from x
),
z (id, origin) as (
select id, origin from y where rn = 1
)
select x.id, z.id as end_parent
from x
join z on x.origin = z.origin
order by x.id
Результат:
ID END_PARENT
-- ----------
1 4
2 4
3 4
4 4
5 7
6 7
7 7
Для справки вот данные, которые я использовал:
create table my_table (
id int,
parent int
);
insert into my_table (id, parent) values (1, null);
insert into my_table (id, parent) values (2, 1);
insert into my_table (id, parent) values (3, 2);
insert into my_table (id, parent) values (4, 3);
insert into my_table (id, parent) values (5, null);
insert into my_table (id, parent) values (6, 5);
insert into my_table (id, parent) values (7, 6);