來源: ?http://blog.csdn.net/itmyhome1990/article/details/16338637
?
ORACLE是一個關系數據庫管理系統,它用表的形式組織數據,在某些表中的數據還呈現出樹型 結構的聯系。
?例如有如下案例:
數據為節選,字段值含義分別為 稅務機構代碼、稅務機構名稱、上級稅務機構代碼,稅務機構級別
sj_swjg_dm為空即根節點的排在第一個,仔細觀察 上圖是樹結構查詢結果,可能不太直觀,看下圖就清楚了
1. 樹結構的描述?
偽列LEVEL為數值型,可以在SELECT 命令中用于各種計算。?
例4 使用LEVEL改變查詢結果的顯示形式。

數據為節選,字段值含義分別為 稅務機構代碼、稅務機構名稱、上級稅務機構代碼,稅務機構級別
select * from extern_dm_swjg查詢的時候默認順序就是上面的順序,可以看出是混亂的并沒有特殊結構特征。
而希望的結果如下圖:

sj_swjg_dm為空即根節點的排在第一個,仔細觀察 上圖是樹結構查詢結果,可能不太直觀,看下圖就清楚了

1. 樹結構的描述?
樹結構的數據存放在表中,數據之間的層次關系即父子關系,通過表中的列與列間的關系來描述,
通過每個節點的父節點,就可以確定整個樹結構。
在SELECT命令中使用CONNECT BY和START WITH 子句可以查詢表中的樹型結構關系。其命令格式如下:
SELECT ...?
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2}?
[START WITH]...?
其中:
CONNECT BY子句說明每行數據將是按層次順序檢索
,并規定將表中的數據連入樹型結構的關系中。PRIORY運算符必須放置在連接關系的兩列中某一個的前面。對于節點間的父子關系,PRIOR運算符在的一側表示父節點,在另一側表示子節點,
從而確定查找樹結構是的順序是自頂向下還是自底向上
。
START WITH 子句為可選項,用來標識哪個節點作為查找樹型結構的根節點。若該子句被省略,則表示所有滿足查詢條件的行作為根節點。
例1?以樹結構方式顯示表的數據。
- select?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
- from?extern_dm_swjg??
- connect? by? prior?swjg_dm?=?sj_swjg_dm??
- start? with?sj_swjg_dm? is? null??
2. 關于PRIOR?
運算符PRIOR被放置于等號前后的位置,決定著查詢時的檢索順序。
例2從節點開始自底向上查詢
- select?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
- from?extern_dm_swjg??
- connect? by??swjg_dm?=?? prior?sj_swjg_dm??
- start? with?swjg_dm?=? '16107100004'??
3.使用LEVEL?
??? 在具有樹結構的表中,每一行數據都是樹結構中的一個節點,由于節點所處的層次位置不同,所以每行記錄都可以有一個層號。層號根據節點與根節點的距離確定。不論從哪個節點開始,該起始根節點的層號始終為1,根節點的子節點為2, 依此類推。?
??? 在查詢中,可以使用偽列LEVEL顯示每行數據的有關層次。LEVEL將返回樹型結構中當前節點的層次,我們可以使用LEVEL來控制對樹型結構進行遍歷的深度。
??? 在查詢中,可以使用偽列LEVEL顯示每行數據的有關層次。LEVEL將返回樹型結構中當前節點的層次,我們可以使用LEVEL來控制對樹型結構進行遍歷的深度。
?
例3 顯示表中的各行數據及層號。
- select? level,?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
- from?extern_dm_swjg??
- connect? by? prior?swjg_dm?=?sj_swjg_dm??
- start? with?sj_swjg_dm? is? null??
偽列LEVEL為數值型,可以在SELECT 命令中用于各種計算。?
例4 使用LEVEL改變查詢結果的顯示形式。
- select?LPAD( LEVEL, LEVEL*3, '?')? as? "LEVEL",?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
- from?extern_dm_swjg??
- connect? by? prior?swjg_dm?=?sj_swjg_dm??
- start? with?sj_swjg_dm? is? null???
在SELECT使用了函數LPAD,關于LPAD函數的使用,請參閱
Oracal的Lpad函數
4.節點和分支的裁剪?
??? 在對樹結構進行查詢時,可以去掉表中的某些行,也可以剪掉樹中的一個分支,使用WHERE子句來限定樹型結構中的單個節點,以去掉樹中的單個節點,但它卻不影響其后代節點(自頂向下檢索時)或前輩節點(自底向頂檢索時)。
??? 在對樹結構進行查詢時,可以去掉表中的某些行,也可以剪掉樹中的一個分支,使用WHERE子句來限定樹型結構中的單個節點,以去掉樹中的單個節點,但它卻不影響其后代節點(自頂向下檢索時)或前輩節點(自底向頂檢索時)。
例5 ?僅剪去了樹中單個節點16107100003?扶風縣國家稅務局
- select?LPAD( LEVEL, LEVEL*3, '?')? as? "LEVEL",?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
- from?extern_dm_swjg??
- where?swjg_dm?!= '16107100003'??
- connect? by? prior?swjg_dm?=?sj_swjg_dm??
- start? with?sj_swjg_dm? is? null??

?在這個查詢中,僅剪去了樹中單個節點swjg_dm為16107100003的,可它的子節點依然存在。若希望剪去樹結構中的某個分支,
?則要用CONNECT BY 子句。CONNECT BY 子句是限定樹型結構中的整個分支,既要剪除分支上的單個節點,
?也要剪除其后代節點(自頂向下檢索時)或前輩節點(自底向頂檢索時)。
例6 ?除去節點16107100003的一支
- select?LPAD( LEVEL, LEVEL*3, '?')? as? "LEVEL",?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
- from?extern_dm_swjg??
- connect? by? prior?swjg_dm?=?sj_swjg_dm??
- and?swjg_dm?!= '16107100003'??
- start? with?sj_swjg_dm? is? null??

? ? 這個查詢結果就與例5不同,除了剪去單個節點 16107100003?外,還將 16107100003?的子節點16107100004剪掉,即把 16107100003??這個分支剪掉了。?
??? 當然WHERE子句可以和CONNECT BY子句聯合使用,這樣能夠同時剪掉單個節點和樹中的某個分支。
??? 當然WHERE子句可以和CONNECT BY子句聯合使用,這樣能夠同時剪掉單個節點和樹中的某個分支。
?
在使用SELECT 語句來報告樹結構報表時應當注意,CONNECT BY子句不能作用于出現在WHERE子句中的表連接。如果需要進行連接,可以先用樹結構建立一個視圖,再將這個視圖與其他表連接,以完成所需要的查詢。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
