Иерархический запрос Oracle SQL для определения пути между двумя элементами

                       1
                       |
      +----------------+-------------------+
      |                |                   |
      2                7                   9
      |                |                   |
   +--+--+             |                +--+--+
   |     |             |                |     |
   3     4             8               10     12
         |                              |
       +-+-+                            |
       |   |                            |
       5   6                           11 

Примечание. Я не смог опубликовать изображение, поэтому постарайтесь рассматривать приведенные выше числа как древовидную структуру с 1 в качестве корневого узла.

Как я могу использовать иерархический запрос, чтобы получить путь между двумя узлами

например: путь между 11 и 4

то есть вывод должен быть

11-10
10-9
9-1
1-2
2-4


person Pratik Bhopal    schedule 23.07.2013    source источник


Ответы (1)


Вы можете начать с листа и подняться вверх:

select p_n || ' - ' || n
from t
where p_n is not null
start with n = 11
connect by prior p_n = n
order by level desc

Вот демонстрация sqlfiddle


РЕДАКТИРОВАТЬ: Хорошо, это немного усложняет ситуацию...

Подняться можно с обеих нод, но тогда придется удалять дубликаты путей (например между 6 и 3 не надо идти через корень 1)

попробуйте что-то вроде этого:

select  the_path 
from
(select case when connect_by_root(n) = 11 then p_n || ' - ' || n else n || ' - ' || p_n end the_path,
 count(*) over (partition by n, p_n) cnt
from t
where p_n is not null
start with n in (11, 4)
connect by prior p_n = n)
where cnt = 1;

Вот еще одна демонстрация sqlfiddle

person A.B.Cade    schedule 23.07.2013
comment
спасибо за ваш ответ ... я не разместил свой вопрос должным образом .. обновил его сейчас !! - person Pratik Bhopal; 24.07.2013