ORACLE分級查詢

2021-08-17 15:36:55 字數 1899 閱讀 8516

分級查詢主要用於查詢樹形結構的記錄。樹形結構的資料存放在表中,資料之間的層次關係即父子關係,通過表中的列與列間的關係來描述。 

查詢雇員表中員工編號、姓名及員工負責人,結果如圖1所示。從結果中可以發現,hardy和rory的負責人是john,john的負責人是donald;eric和kary的負責人是harky,harky的負責人是donald,最終可以形成一張樹形結構圖,如圖2所示。

圖1

圖2[sql]view plain

copy

select

[level

], column

, ...  

from

table

[where

condition(s)]  

[start with

condition(s)]  

[connect

byprior

column1 = column2] ;

說明:1.level代表層級。 在具有樹結構的表中,每一行資料都是樹結構中的乙個節點,由於節點所處的層次位置不同,所以每行記錄都可以有乙個層號。層號根據節點與根節點的距離確定。不論從哪個節點開始,該起始根節點的層號始終為 1 ,根節點的子節點為 2 , 依此類推。

2.start with定義查詢起始節點。在自頂向下查詢樹結構時,不但可以從根節點開始,還可以定義任何節點為起始節點,以此開始向下查詢。這樣查詢的結果就是以該節點為開始的結構樹的一枝。 不但可以指定乙個根節點,還可以指定多個根節點。start with 子句為可選項,若該子句被省略,則表示所有滿足查詢條件的行作為根節點。

3.connect by 子句指定層次檢索的順序。 根據priory 運算子放置在連線關係的位置,從而確定查詢樹結構是的順序是自頂向下還是自底向上。connect by prior parent key= child key,表明順序是自頂向下;connect by prior child key= parent key,表明順序是自底向上。

以員工編號是e005為根節點,自頂向下查詢節點下所有的節點層級、員工編號、姓名及負責人編號,結果如圖3所示。

圖3以員工編號是e002為根節點,自底向上查詢節點所在分支所有的節點層級、員工編號、姓名及負責人編號,結果如圖4所示。

圖4對於分級查詢的結果集節點的裁剪有兩種方式,一種方式是在where子句中指定過濾條件,另一種方式是在connect by子句中指定過濾條件。兩種方式的區別是,where子句中指定過濾條件,只能裁剪掉滿足條件的節點,而connect by子句中指定過濾條件,不僅能夠裁剪掉滿足條件的節點,而且能裁剪掉滿足條件節點所在的分支後的所有後代節點或前輩節點。

在where子句中指定過濾條件,結果集中不僅刪除了員工編號是e004的記錄,而且刪除了e004節點的後代節點e002、e003,結果如圖5所示。

圖5在where子句中指定過濾條件,結果集中不僅刪除了員工編號是e004的記錄,而且刪除了e004節點的後代節點e002、e003,結果如圖6所示。

分級查詢的實現

由於水平有限,這個問題困繞了我好久,今天終於在csdn社群解決,高興啊。還是csdn強人多呀。問題 現在有三個資料表 表1 user user id user name role id 1 zs 2 2 ls 1 表2 fieldpriv role id field name 1 gdp 2 she...

無限分級數量查詢優化

無限分級的資料查詢是個頭痛的問題,遞迴查詢類別,再組合成字串,用 in 來解決子類所有產品的問題,但是這個效率太低,低的讓人無法接受,在此,有乙個sql的方法,可讓我們提高效率。提取子類的所有類別id create function getchild id int returns t table i...

無限分級數量查詢優化

無限分級的資料查詢是個頭痛的問題,遞迴查詢類別,再組合成字串,用 in 來解決子類所有產品的問題,但是這個效率太低,低的讓人無法接受,在此,有乙個sql的方法,可讓我們提高效率。提取子類的所有類別id create function getchild id int returns t table i...