oracle中的層級遞迴查詢操作
阿新 • • 發佈:2019-02-15
oracle中的層級操作非常方便,在使用之後愛不釋手,以前要實現該種資料查詢操作,需要非常複雜的實現過程。在oracle中通過connect by可以實現前面的目的,通常情況下層級查詢基本都能實現遞迴查詢目的。下面是connect by的使用語法:
select [level], column, expr...
from table
[where condition]
start with condition
connect by [prior nodeCode1 = nodeCode2 | nodeCode1 = prior nodeCode2];
level :層級數,是個偽列。
start with :起始記錄條件,是層級查詢必要條件,支援支查詢操作 。
connect by :表達層級關係,通過priore表示父層級/子層級,不支援子查詢操作。
priore 關鍵字說明:
- priore 在nodeCode1 前面表示 層級查詢,priore在表示以start with 作為第一級,並查詢該層級以下的所有層級。
- priore 在nodeCode2前面表示以start with 作為第一級,並查詢該層級以上的所有層級。
/*prior在等號前面查詢*/
select * from ORGANIZE where ORGTYPE = 1 start with code = '3502030039' Connect By Prior code = PARENTCODE
上面語句查詢結果:
1 廈門教育局
2 思明區教育局
3 湖裡區教育局
4 海滄區教育局
5 集美區教育局
6 翔安區教育局
7 同安區教育局
/*prior在等號後面查詢*/
select *
from ORGANIZE
where ORGTYPE = 1
start with code = '3502030039'
Connect By code = Prior PARENTCODE
上面語句查詢結果:
1 1 廈門教育局 2 2 福建省教育廳 3 3 中華人民共和國教育部
從上面兩個查詢結果很容易理解prior位置變化的作用。
oracle 其他層級操作函式
- SYS_CONNECT_BY_PATH() 函式實現層級節點合併拼接操作
select level,ORGNAME,sys_connect_by_path(ORGNAME,'>') [合併層級], prior ORGNAME [父節點]
from ORGANIZE
where ORGTYPE = 1
start with code = '3502030039'
Connect By Prior code = PARENTCODE ;
查詢結果
1 1 廈門教育局 >廈門教育局
2 2 思明區教育局 >廈門教育局>思明區教育局 廈門教育局
3 2 湖裡區教育局 >廈門教育局>湖裡區教育局 廈門教育局
4 2 海滄區教育局 >廈門教育局>海滄區教育局 廈門教育局
5 2 集美區教育局 >廈門教育局>集美區教育局 廈門教育局
6 2 翔安區教育局 >廈門教育局>翔安區教育局 廈門教育局
7 2 同安區教育局 >廈門教育局>同安區教育局 廈門教育局
- CONNECT_BY_ISLEAF特性
CONNECT_BY_ISLEAF特性可以用來判斷該層級是否為葉節點,1表示葉節點.
select level,prior ORGNAME,sys_connect_by_path(ORGNAME,'<'),decode(connect_by_isleaf, 1,'葉節點', null) "節點型別"
from ORGANIZE
where ORGTYPE = 1
start with code = '3502030039'
Connect By Prior code = PARENTCODE
查詢結果
1 1 <廈門教育局
2 2 廈門教育局 <廈門教育局<思明區教育局 葉節點
3 2 廈門教育局 <廈門教育局<湖裡區教育局 葉節點
4 2 廈門教育局 <廈門教育局<海滄區教育局 葉節點
5 2 廈門教育局 <廈門教育局<集美區教育局 葉節點
6 2 廈門教育局 <廈門教育局<翔安區教育局 葉節點
7 2 廈門教育局 <廈門教育局<同安區教育局 葉節點
- CONNECT_BY_ROOT
CONNECT_BY_ROOT可用於讀取根節點
select
level,ORGNAME ,prior ORGNAME "父節點",
sys_connect_by_path(ORGNAME,'<') "節點合併",
decode(connect_by_isleaf, 1,'葉節點', null) "節點型別" ,
connect_by_root ORGNAME "根節點"
from ORGANIZE
where ORGTYPE = 1
start with code = '3502030039'
Connect By Prior code = PARENTCODE
查詢結果
LEVEL ORGNAME 父節點 節點合併 節點型別 根節點
1 廈門教育局 <廈門教育局 廈門教育局
2 思明區教育局 廈門教育局 <廈門教育局<思明區教育局 葉節點 廈門教育局
2 湖裡區教育局 廈門教育局 <廈門教育局<湖裡區教育局 葉節點 廈門教育局
2 海滄區教育局 廈門教育局 <廈門教育局<海滄區教育局 葉節點 廈門教育局
2 集美區教育局 廈門教育局 <廈門教育局<集美區教育局 葉節點 廈門教育局
2 翔安區教育局 廈門教育局 <廈門教育局<翔安區教育局 葉節點 廈門教育局
2 同安區教育局 廈門教育局 <廈門教育局<同安區教育局 葉節點 廈門教育局
- order siblings by
oracle中的層級查詢結果直接使用orader by 進行排序無法得到我們想要的結果,但可以通過order siblings by達到我們想要的既按照層級排序,又按照欄位排序