Вы были на правильном пути, но вам не хватает двух основных ингредиентов.
Во-первых, чтобы указать начальную точку, вам нужно использовать предложение start with
. Очевидно, это будет что-то вроде start with id = <input value>
. Вы не сказали нам, как вы предоставите входное значение. Наиболее распространенным подходом является использование переменных связывания (лучше всего по многим причинам); Я назвал переменную связывания input_id
в запросе ниже.
Во-вторых, вам нужна только «последняя» строка (поскольку вы перемещаетесь по дереву в противоположном направлении: к root, а не от root, поэтому root теперь является "листом", когда вы перемещаетесь таким образом). Для этого вы можете использовать псевдостолбец connect_by_isleaf
в предложении where
.
Итак, запрос должен выглядеть следующим образом: (обратите внимание, что я выбираю только идентификатор сообщения root, поскольку это все Вы просили, если вам нужно больше столбцов, включите их в select
)
select msg_id
from table_x
where connect_by_isleaf = 1 -- keep just the root row (leaf in this traversal)
start with id = :input_id -- to give the starting node
connect by prior parent_id = id
;