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,如需轉載請自行聯系原作者