oracle 樹形SQL


oracle樹形sql查詢實例分析
 
通過此SQL語句 
[sql]
select  * from tree  
 查看原始數據如下:
 

 
我們要想得到如下的一個樹形查詢結果如下圖所示
(包含 ROOT, LEVEL, IS_LEAF,  PATH 四個字段)
 

 
可執行如下SQL語句:
[sql]
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;  
 
[sql]
樹形查詢的重點在於  start with ...  connect by prior .... 語句  
[sql]
以及 connect_by_root ,connect_by_isleaf,sys_connect_by_path這三個函數,
decode是一般常用的函數。  
 
<轉:http://www.2cto.com/database/201205/131591.html>
 
 
=========================================================================
1、樹形SQL結構
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

查詢結果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM