SQL:具有多个根/父级的分层查询

时间:2013-01-04 16:24:42

标签: sql oracle

我有一个表格,描述以树状结构组织的元素:

ID, PARENT_ID, NAME  
0   null       TOP  
1   0          A  
2   0          B  
3   0          C  
4   1          AA  
5   2          BA 
6   3          CA  
7   6          CAA
...

此层次结构中可以有多个级别。

假设有一个元素列表(比如ID 2和3),我希望从表中获取所有子记录。

这样的事情:

select *
from MY_TABLE 
start with PARENT_ID in (2,3)
connect by PARENT_ID = prior ID

将返回:

ID, PARENT_ID, NAME 
5   2          BA
6   3          CA
7   6          CAA

但是,我希望将每个输出记录映射到列表中的原始父级(2,3),以便输出看起来像这样:

ORIGINAL_PARENT_ID, ID, PARENT_ID, NAME 
2                   5   2          BA
3                   6   3          CA
3                   7   6          CAA

怎么做?

2 个答案:

答案 0 :(得分:5)

connect_by_root可能就是您追求的目标?

SQL> select t.*, connect_by_root parent_id as ORIGINAL_PARENT_ID
  2  from MY_TABLE  t
  3  start with PARENT_ID in (2,3)
  4  connect by PARENT_ID = prior ID
  5  /

        ID  PARENT_ID NAM ORIGINAL_PARENT_ID
---------- ---------- --- ------------------
         5          2 BA                   2
         6          3 CA                   3
         7          6 CAA                  3

答案 1 :(得分:0)

假设您的名字与您拥有的名称相同,那么问题可以在没有connect by的情况下完成。您可以使用简单的字符串操作。

with ToFind (
    select 'C' as parent from dual union all
    select 'B' as parent from dual
   )
select t.*
from t join
     ToFind tf
     on t.name like tf.parent, 100)||'%' and t.name <> tf.parent