ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 维护树状数据

维护树状数据

原创 Linux操作系统 作者:壹頁書 时间:2013-11-21 23:27:35 0 删除 编辑
给定一个树,要求查询所有状态为"异常"的叶子节点的所有上级节点

  1. create table t as select employee_id id,manager_id pid ,'正常' status from hr.employees;
  2. update t set status='异常' where id in ('109','107');
查询表数据如下.因为节点109,107状态为异常,所以需要查他们的所有上级节点,即100,101,108,102,103

  1. SQL> select sys_connect_by_path(id,'/') path,status from t start with pid is null connect by pid=prior id;

  2. PATH STAT
  3. -------------------- ----
  4. /100 正常
  5. /100/101 正常
  6. /100/101/108 正常
  7. /100/101/108/109 异常
  8. /100/101/108/110 正常
  9. /100/101/108/111 正常
  10. /100/101/108/112 正常
  11. /100/101/108/113 正常
  12. /100/101/200 正常
  13. /100/101/203 正常
  14. /100/101/204 正常
  15. /100/101/205 正常
  16. /100/101/205/206 正常
  17. /100/102 正常
  18. /100/102/103 正常
  19. /100/102/103/104 正常
  20. /100/102/103/105 正常
  21. /100/102/103/106 正常
  22. /100/102/103/107 异常
  23. /100/114 正常
  24. /100/114/115 正常
  25. /100/114/116 正常
  26. /100/114/117 正常
  27. ....以下内容省略

  28. 已选择107行。
外连接方法
    1.查询状态为异常的叶子节点
    2.查询所有非叶子节点(他们拥有子节点)
    3.不等连接
  1. select distinct t2.pid from (
  2.     select id,pid,status,sys_connect_by_path(id,':') path from t
  3.     where connect_by_isleaf=1 and status='异常'
  4.     start with pid is null connect by pid=prior id) t1
  5. inner join (
  6.     select distinct pid from t where pid is not null) t2
  7. on instr(t1.path,':'||t2.pid)!=0;
视图t1的数据
  1. ID PID STAT PATH
  2. --- ---------- ---- ----------------
  3. 109 108 异常 :100:101:108:109
  4. 107 103 异常 :100:102:103:107
树遍历方法
    1.找到所有状态为异常的叶子节点
    2.自底向上遍历

  1. with v1 as(
  2.     select pid from t where connect_by_isleaf=1 and status='异常' start with pid is null connect by pid=prior id
  3. )
  4. select distinct t.id from t start with t.id in (select v1.pid from v1) connect by prior pid=id;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-777280/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    621
  • 访问量
    5985944