如何使用 oracle-10g 在层次结构查询中获取根祖先?

use*_*331 5 database oracle tree root oracle10g

表很简单,pid表示父id,cid表示子id。而且表中可能有不止一棵树。所以我的问题是:
知道几个cid,我们如何得到
这里的根祖先是一个例子

pid cid
1 2
2 3
3 4
5 6
6 7
7 8

给定 cid = 4 或 cid = 8,我想最终获得 pid 为 1 ro 5 的根祖先
,我使用的是oracle 10g

Att*_*áth 7

在 aa 数据库环境中,顶层的外键很可能是空值,如下所示:

| pid  | cid  |
|------*------|
| null |  2   |
|  2   |  3   |
|  3   |  4   |
| null |  6   |
|  6   |  7   |
|  7   |  8   |
Run Code Online (Sandbox Code Playgroud)

所以我建议使用类似的东西:

select connect_by_root(t1.cid) as startpoint,
       t1.cid                  as rootnode
  from your_table t1
 where connect_by_isleaf = 1
 start with t1.cid in (8, 4)
connect by prior t1.pid = t1.cid;
Run Code Online (Sandbox Code Playgroud)

小提琴


Ego*_*off 4

select 
  t1.cid,
  connect_by_root(t1.pid) as root
from 
  your_table t1
  left join your_table t2
    on t2.cid = t1.pid
where t1.cid in (4, 8)
start with t2.cid is null
connect by t1.pid = prior t1.cid
Run Code Online (Sandbox Code Playgroud)

小提琴