oracle用表的形式組織資料,某些資料還呈現樹狀結構,提供了對這些資料的組織、查詢等功能。在掃描樹結構表時,要依次通路樹中的每一個節點,并且每個節點隻能通路一次,其步驟如下:
1:從根節點開始
2:通路該節點
3:判斷該節點有無被通路的子節點,若有,則轉向它最左側未被通路的子節點,并執行第二步,否則執行第四步
4:若該節點為根節點,則通路完畢,否則執行第五步
5:傳回到該節點的父節點,并執行第三步驟
總之,整個掃描過程是一個中序周遊樹的過程
1:樹結構描述
資料之間的層次關系(父子關系)通過表中列與列之間的關系來描述
select
connect by {prior col1 = col2 || col1 = prior col2 }
[start with ]
connect by子句說明資料按照層次順序檢索,并将資料連入樹形結構關系中
prior運算符必須放在連接配接關系的兩列中某一列的前面,進而确定查找順序是自上而下還是自下而上,連接配接關系中,可使用列名、清單達式
start with 子句為可選項,用來辨別查找結構的根節點。若省略,則表示所有滿足條件的行作為根節點
2:關于prior
prior和父列子列的相對位置,決定着查詢方向。放在子節點前面是表示由父節點向子節點方向檢索,放在父節點前面時表示從子節點向父節點方向檢索,可以将prior想象成一個箭頭,放在誰的前面,就向那個方向檢索。
3:定義起始查找節點
不但可以從根節點開始,而且可以定義任何節點為起始節點
start with可指定一個或多個根節點
4:使用level
節點所處位置不同,每行記錄都有一個層号,層号有節點與根節點的距離決定。無論從哪個節點開始,該其實根節點的層号始終為1,依次類推
僞列level顯示每行資料的有關層次,傳回屬性結構中目前節點的層次,可用來控制對樹形結構進行周遊的深度,僞列level為數值型,可與lpad、rpad等結合進行資料展示
5:節點和分支的剪裁
where子句限定單個節點,而不影響其子節點(自上而下)或父節點(自下而上)
connect by 子句限定整個以目前節點為起始節點的整個分支
兩者可聯合使用
6:排序顯示
order by子句,改變查詢結果的顯示順序
在10g又增加了幾個新的特性,增強了connect by子句:
從9i開始,可通過sys_connect_by_path函數實作從父節點到目前行内容以”path“或者層次元素清單的形式顯示出來。sys_connect_by_path(child,'/')
connect_by_root,用在列名之前傳回目前層的根節點(最進階節點的内容)
connect_by_isleaf,來判斷目前行是不是葉子,如果是葉子就會在僞列中顯示1
connect_by_iscycle,10g中增加對樹中環狀循環的處理;一旦資料中出現了循環記錄(如:兩個節點互為對方父節點),在10g以 前版本的資料庫中會錯誤提示”ora-01436。。“,隻要指定nocycle可避免報錯,且通過connect_by_iscycle屬性就知道哪些 節點産生了循環,如果出現循環,connect_by_iscycle僞列顯示為1,否則顯示為0。
select connect_by_iscycle, dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname
from t_tonedirlib
start with fatherindex = 666
connect by NOCYCLE fatherindex = prior dirindex
特殊用法:
得到1到10的一個序列
select rownum from dual
connect by rownum<=10