2

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

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

如何做呢?

4

2 回答 2

7

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
于 2013-01-04T16:49:49.317 回答
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
于 2013-01-04T16:34:56.943 回答