当前位置: 代码迷 >> Oracle技术 >> 经过父子关系得到其某一特定等级的祖先
  详细解决方案

经过父子关系得到其某一特定等级的祖先

热度:106   发布时间:2016-04-24 08:09:07.0
通过父子关系得到其某一特定等级的祖先

基础数据如上图,提供了父子的依赖关系以及子节点的LEVEL,现在在保留原表行数的基础上,添加4列,分别提供每个子节点对应的4级父节点、3级父节点、2级父节点和1级父节点,即最终需求如下图:

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

数据量不仅仅是这几条,我图片上的仅仅是个数据片段,数据量太大的时候,update的话,自动性和效率性不太好满足


WITH tab AS(
SELECT '01' 子节点,1 子节点等级,'-1' 父节点 FROM dual UNION ALL
SELECT '0101' 子节点,2 子节点等级,'01' 父节点 FROM dual UNION ALL
SELECT '010101' 子节点,3 子节点等级,'0101' 父节点 FROM dual UNION ALL
SELECT '01010101' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '01010102' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '0101010201' 子节点,5 子节点等级,'01010102' 父节点 FROM dual UNION ALL
SELECT '0101010202' 子节点,5 子节点等级,'01010102' 父节点 FROM dual UNION ALL
SELECT '0101010203' 子节点,5 子节点等级,'01010102' 父节点 FROM dual UNION ALL
SELECT '01010103' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '01010104' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '0101010401' 子节点,5 子节点等级,'01010104' 父节点 FROM dual UNION ALL
SELECT '0101010402' 子节点,5 子节点等级,'01010104' 父节点 FROM dual )
 SELECT tab.*,
        SYS_CONNECT_BY_PATH(子节点, '/') "PATH", 
        regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,4),
        regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,3),
        regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,2),
        regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,1)       
   FROM tab
  START WITH 父节点='-1'
 CONNECT BY PRIOR 子节点 = 父节点;

大神啊。。。效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?

从多个根节点的时候会出现重复,是connect by导致的,可以通过distinct处理。
  相关解决方案