Вам нужен иерархический запрос (connect by ...
) Примерно так:
with
tbl (id, parentid) as (
select 1, null from dual union all
select 2, null from dual union all
select 3, 2 from dual union all
select 4, 2 from dual union all
select 5, 4 from dual union all
select 6, 1 from dual
)
select id
from tbl
where connect_by_isleaf = 1
start with id = 5
connect by id = prior parentid
;
ID
-----
2
"В реальной жизни" у вас будет таблица tbl
со столбцами id
и parentid
(I смоделировали это в предложении with
, но это только для удобства; сначала удалите его.) И вы не станете жестко программировать начальный узел; вы, вероятно, будете использовать переменную связывания в предложении start with
.
Ключ здесь - это предложение where
, использующее псевдостолбец connect_by_isleaf
.