1. 程式人生 > >oracle中的層級遞迴查詢操作

oracle中的層級遞迴查詢操作

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達到我們想要的既按照層級排序,又按照欄位排序