Получение кода i-го родительского элемента для каждой записи в иерархическом запросе

SimonInBlues
Дата: 09.12.2007 22:20:50
Подскажите, пожалуйста, как можно получить для любого дочернего элемента код (первичный ключ) его произвольного i-го родителя.
В частности, для получения кода корневого элемента, т.е. родителя 1-го уровня, использовал запрос, показанный ниже. Но мне интересно, можно ли решить задачу в общем случае? Подразумевается, что номер интересующего родителя-предка - некая константа, участвующая в запросе, сам алгоритм при этом универсален и не зависит от ее значения (решение для Oracle от 9 и выше).

    select
t.id,
(
select
max(d.id) keep (dense_rank last order by level)
from mytable d
connect by d.id = prior d.parent_id
start with d.id = t.id

) first_parent_id
from (
select
t.id
from mytable t
connect by prior t.id = t.parent_id
start with t.parent_id is null
) t
Софтверный проктолог
Дата: 09.12.2007 22:28:04
Нужно развернуть дерево до i-того элемента вглубь от текущего и извлечь этот элемент. У вас так?
SimonInBlues
Дата: 09.12.2007 22:45:27
У меня иерархия раскручивается от каждого дочернего элемента вверх до его корневого родительского элемента. При этом берется самый старший элемент из полученного списка, который будет в этом алгоритме корневым.
Но я хочу найти способ, как мне ограничить этот список каким-либо номером родителя, отличным от самого старшего в списке, чтобы можно было получить не только корневой элемент, но и произвольный родительский элемент 1,2,3-го уроня и т.д.
Vladimir Sitnikov
Дата: 09.12.2007 23:00:17
SimonInBlues
У меня иерархия раскручивается от каждого дочернего элемента вверх до его корневого родительского элемента
Зря вы иерархию второй раз раскручиваете. Поищите в форуме 'чем заменить connect_by_root' и обратите внимание на decode(level
Volder
Дата: 09.12.2007 23:01:01
SimonInBlues
Но я хочу найти способ, как мне ограничить этот список каким-либо номером родителя, отличным от самого старшего в списке, чтобы можно было получить не только корневой элемент, но и произвольный родительский элемент 1,2,3-го уроня и т.д.
строить иерархию в обратную сторону в твоем случае совершенно не нужно.
поищи по форуму рецепт от Elic'a "чем заменить connect_by_root для 9-ки"
а потом немножко доработай его, чтобы он вместо 1 уровня искал нужный тебе.
все оч просто.
SimonInBlues
Дата: 09.12.2007 23:22:22
всем огромное спасибо! решение оказалось действительно очень простым:
        select
t.id,
replace(sys_connect_by_path(decode(level, 3, t.id), '/'), '/') grand_parent_id,
from mytable t
connect by prior t.id = t.parent_id
start with t.parent_id is null