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

you896 2014-05-07 10:23:55

基础数据如上图,提供了父子的依赖关系以及子节点的LEVEL,现在在保留原表行数的基础上,添加4列,分别提供每个子节点对应的4级父节点、3级父节点、2级父节点和1级父节点,即最终需求如下图:
...全文
190 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
you896 2014-05-08
  • 打赏
  • 举报
回复
引用 6 楼 hidanger521 的回复:
[quote=引用 5 楼 you896 的回复:] [quote=引用 4 楼 hidanger521 的回复:] [quote=引用 3 楼 you896 的回复:] 数据量不仅仅是这几条,我图片上的仅仅是个数据片段,数据量太大的时候,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 子节点 = 父节点;
[/quote] 大神啊。。。效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?[/quote] 从多个根节点的时候会出现重复,是connect by导致的,可以通过distinct处理。 [/quote]在问一下,我这个父子关系表大约有9000行,按照这个语句,distinct去重后,效率很低,运行了一晚上,完全没办法插入到另一张表里面,甚至select distinct出不来数据,是否有更高效的方式,谢谢。。。
you896 2014-05-07
  • 打赏
  • 举报
回复
引用 4 楼 hidanger521 的回复:
[quote=引用 3 楼 you896 的回复:] 数据量不仅仅是这几条,我图片上的仅仅是个数据片段,数据量太大的时候,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 子节点 = 父节点;
[/quote] 大神啊。。。效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?
流浪川 2014-05-07
  • 打赏
  • 举报
回复
引用 3 楼 you896 的回复:
数据量不仅仅是这几条,我图片上的仅仅是个数据片段,数据量太大的时候,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 子节点 = 父节点;
you896 2014-05-07
  • 打赏
  • 举报
回复
数据量不仅仅是这几条,我图片上的仅仅是个数据片段,数据量太大的时候,update的话,自动性和效率性不太好满足
RUMBLE_ZHENG 2014-05-07
  • 打赏
  • 举报
回复
引用 1 楼 you896 的回复:
请各位大拿帮帮忙,谢谢、、、
根据节点编号规则,依次去除父节点后两位就行了。 5级节点是有1,2,3,4级父节点;4级节点仅有1,2,3级父节点。。。。 依次根据子节点等级去分别update新增的四个列就行了。
you896 2014-05-07
  • 打赏
  • 举报
回复
请各位大拿帮帮忙,谢谢、、、
流浪川 2014-05-07
  • 打赏
  • 举报
回复
引用 5 楼 you896 的回复:
[quote=引用 4 楼 hidanger521 的回复:] [quote=引用 3 楼 you896 的回复:] 数据量不仅仅是这几条,我图片上的仅仅是个数据片段,数据量太大的时候,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 子节点 = 父节点;
[/quote] 大神啊。。。效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?[/quote] 从多个根节点的时候会出现重复,是connect by导致的,可以通过distinct处理。

3,494

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧