
(包含 ROOT, LEVEL, IS_LEAF, PATH 四個字段):

select connect_by_root(child_col) root, level , decode(connect_by_isleaf,0,'No',1,'Yes') is_leaf, sys_connect_by_path(child_col,'/') path from tree start with parent_col is null connect by prior child_col=parent_col;
decode是一般常用的函數。
select connect by {prior col1 = col2 || col1 = prior col2 } [start with ]
connect by子句:指定父行和子行的關系。說明數據按照層次順序檢索,並將數據連入樹形結構關系中
prior運算符:引用父行。必須放在連接關系的兩列中某一列的前面,從而確定查找順序是自上而下還是自下而上,連接關系中,可使用列名、列表達式
( prior被放置於等號前后的位置,決定着查詢時的檢索順序
置於等號前面,由父節點向子節點方向檢索;置於等號后面,則從子節點向父節點方向檢索)
start with 子句:為可選項,用於指定查詢的根行。若省略,則表示所有滿足條件的行作為根節點
(不但可以從根節點開始,而且可以定義任何節點為起始節點
start with可指定一個或多個根節點)
2、版本新特性
在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。
===============================================================
相關實例:
organization、district是多對多關系,org_dis是中間表。
要查出機構下的所有城市,城市用","分隔
select t.orgid, MAX(substr(sys_connect_by_path(t.name, ','), 2)) as city_name from (select do.id_organization orgid, d.name as name, row_number() over(partition by do.id_organization order by d.name desc) rn from district d, dis_org do where d.id_district = do.id_district) t START WITH rn = 1 CONNECT BY rn = PRIOR rn + 1 AND orgid = PRIOR orgid GROUP BY orgid
查詢結果: