3
                       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

4

1 回答 1

4

你可以从叶子开始往上爬:

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 演示

于 2013-07-23T10:21:18.780 回答