我有一个表格,描述以树状结构组织的元素:
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
怎么做?
答案 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