背景1:table中共3组数据,如图,其中A,B,C,各为每组数据的母节点,分别按母节点或者子节点获取数据用以分组显示。
1.源表数据如下:

1.按照子节点获取数据并分组:得到:子+父
--根据子节点查找所有父节点(得到:子+父)
select connect_by_root(h.verweis) child, h.*
from test_table h
start with h.VERWEIS in (4, 7, 9)
connect by prior h.U_PARENT_VERWEIS = h.VERWEIS;
结果如下图:

2.按照母节点获取数据并分组:得到:子
--根据父节点查找所有子节点(得到:子)
select connect_by_root(a.U_PARENT_VERWEIS) father,a.*
from test_table a
start with U_PARENT_VERWEIS in (1, 5, 8)
connect by prior VERWEIS = U_PARENT_VERWEIS
union--补上父节点
select VERWEIS father,b.*
from test_table b
where VERWEIS in (1, 5, 8);
结果如下图

**背景2:后来接到个需求,是根据父子节点找最底层子节点的SQL,但是数据格式又和背景1不一样,它的结构不是A,A-1,A-2的形式,他是A,A-1-x(x可以是1~n,都属于长子),A-2-x (x可以是1~ n,都属于二子)…
一直到A-m-x(x可以是1~ n,都属于末子),需求是根据A找到所有末子A-m-x,中间的都不要。
**
如下图,根据A,只要A-1-X-X

SQL:
--根据父节点找到所有最底层的子节点,中间节点不需要
select connect_by_root(t.D_VALUE), level, t.*
from TEST_TABLE2 t
where CONNECT_BY_ISLEAF = 1
start with D_VALUE = 'A'
--connect by prior VERWEIS = U_PARENT_VERWEIS
connect by nocycle prior VERWEIS=U_PARENT_VERWEIS;--注意必须是:子节点=父节点,如果是父节点=子节点就错误
本文介绍了如何在Oracle数据库中进行父子节点的查询操作。内容包括根据父节点获取所有子节点(展示为子+父的形式),以及如何找到最底层的子节点(例如A-1-X-X),满足特定的数据结构需求。
818

被折叠的 条评论
为什么被折叠?



