ORACLE父子节点的查询与展示(根据父节点查子节点&根据子节点查父节点)

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

1.源表数据如下:
在这里插入图片描述
1.按照子节点获取数据并分组:得到:子+父

1
2
3
4
5
--根据子节点查找所有父节点(得到:子+父)
  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.按照母节点获取数据并分组:得到:子

1
2
3
4
5
6
7
8
9
--根据父节点查找所有子节点(得到:子)
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:

1
2
3
4
5
6
7
--根据父节点找到所有最底层的子节点,中间节点不需要
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;--注意必须是:子节点=父节点,如果是父节点=子节点就错误