Oracle - start with connect by 樹操做

Oracle - start with connect by 樹操做

準備工做:建表、插數據

create table tprior
( parentid number(10),
  subid    number(10)
);
 
insert into tprior values ( 1, 2 );
insert into tprior values ( 1, 3 );
insert into tprior values ( 2, 4 );
insert into tprior values ( 2, 5 );
insert into tprior values ( 3, 6 );
insert into tprior values ( 3, 7 );
insert into tprior values ( 5, 8 );
insert into tprior values ( 5, 9 );
insert into tprior values ( 7, 10 );
insert into tprior values ( 7, 11 );
insert into tprior values ( 10, 12 );
insert into tprior values ( 10, 13 );
 
commit;

 

表數據概況、B-Tree 結構

select * from tprior;spa

表數據

對應的 B-Tree 結構:

SQL

select parentid, subid, level
  from tprior
 start with subid = 7
connect by subid = prior parentid
 order by level;

  • start with subid = 7,首先找出 level 1 記錄 (parentid, 7) 即 (3, 7),做爲起始點
  • connect by subid = prior parentid,表示從子節點往父節點方向遍歷,即 level 1 記錄 (3, 7) 中的父節點 3,做爲 level 2 記錄的子節點,查得 level 2 記錄 (1, 3)
  • 一直查到根節點結束

 

select parentid, subid, level
  from tprior
 start with subid = 7
connect by prior subid = parentid
 order by level;

  • start with subid = 7,level 1 記錄 (3, 7)
  • connect by prior subid = parentid,從父節點向子節點方向遍歷,即 level 1 記錄 (3, 7) 中的子節點 7,做爲 level 2 記錄的父節點,查得 level 2 記錄 (7, 10)、(7, 11)
  • 以此類推,一直查到沒有子節點的節點爲止

 

select parentid, subid, level
  from tprior
 start with parentid = 7
connect by subid = prior parentid
 order by level;

  • start with parentid = 7,level 1 記錄 (7, 10)、(7, 11)
  • connect by subid = prior parentid,子節點向節點方向遍歷,上一組數據的父節點 7,做爲 level 2 記錄的子節點,查得 (3, 7)、(3, 7) {爲何 level 2 是 2 組數據呢?由於 level 1 記錄有 2 個}
  • 以此類推

 

select parentid, subid, level
  from tprior
 start with parentid = 7
connect by prior subid = parentid
 order by level;

  • start with parentid = 7,level 1 記錄 (7, subid)、(7, subid) 即 (7, 10)、(7, 11)
  • connect with prior parentid = subid,子節點向父節點遍歷,level 1 記錄的父節點 十、11,做爲 level 2 記錄的子節點,查得 (10, 13)、(10, 12)
  • 以此類推

 

select parentid, subid, level
  from tprior
 where parentid > 3
 start with subid = 12
connect by subid = prior parentid
 order by level;

  • SQL 執行順序是:先執行 start with,再執行 connect by,最後執行 where。
  • 結論:where 只是樹結構的修剪,不改變樹的層次結構。
相關文章
相關標籤/搜索