天天看點

start with ...connect by的用法

Start with...Connect By子句遞歸查詢一般用于一個表維護樹形結構的應用。  

建立示例表:  

CREATE TABLE TBL_TEST  

(  

ID NUMBER,  

NAME VARCHAR2(100 BYTE),  

PID NUMBER DEFAULT 0  

);  

插入測試資料:  

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');  

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');  

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');  

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');  

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');  

從Root往樹末梢遞歸  

select * from TBL_TEST  

start with id=1  

connect by prior id = pid  

從末梢往樹ROOT遞歸  

start with id=5  

connect by prior pid = id  

=====  

簡單說來是将一個樹狀結構存儲在一張表裡,比如一個表中存在兩個字段:  

id,pid那麼通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。  

用上述文法的查詢可以取得這棵樹的所有記錄。  

其中:  

條件1 是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。  

條件2 是連接配接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR id = pid就是說上一條記錄的id 是本條記錄的pid,即本記錄的父親是上一條記錄。  

條件3 是過濾條件,用于對傳回的所有記錄進行過濾。  

簡單介紹如下:  

早掃描樹結構表時,需要依此通路樹結構的每個節點,一個節點隻能通路一次,其通路的步驟如下:  

第一步:從根節點開始;  

第二步:通路該節點;  

第三步:判斷該節點有無未被通路的子節點,若有,則轉向它最左側的未被通路的子節,并執行第二步,否則執行第四步;  

第四步:若該節點為根節點,則通路完畢,否則執行第五步;  

第五步:傳回到該節點的父節點,并執行第三步驟。  

總之:掃描整個樹結構的過程也即是中序周遊樹的過程。  

按照上面給的分析即可對表中的資料構進行分析,以上的方法隻适合表中有一棵樹的情況。 

本文轉自sucre03 51CTO部落格,原文連結:http://blog.51cto.com/sucre/380296,如需轉載請自行聯系原作者