維護樹狀資料

壹頁書發表於2013-11-21
給定一個樹,要求查詢所有狀態為"異常"的葉子節點的所有上級節點

  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章