背景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;--注意必须是:子节点=父节点,如果是父节点=子节点就错误 |