既然會看ORACLE遞歸查詢那么大家應該是比較清楚遞歸是什么意思了,在這里我就不多加說明了,只作簡單介紹了。
言歸正傳所謂遞歸查詢那么數據表中數據的結構應該是符合遞歸查詢的基本條件,即表中有ID,PID(節點編號、父節點編號)如果把數據以UI的方式展現出來應該是一棵或多棵樹了。
那么我們要以其中一個節點去遞歸查詢出這個節點子節點或父節點的過程就是我們所要說明的。
遞歸查詢語法:
?
select ... from tablename? where 條件4 start with 條件1? connect by 條件2?AND 條件3
?
如下面的表結構 http://www.cnblogs.com/wanghonghu/archive/2012/08/31/2665945.html
CREATE TABLE SC_DISTRICT ( IID NUMBER ( 10 ) NOT NULL , PARENT_ID NUMBER ( 10 ), INAME VARCHAR2 ( 255 BYTE) NOT NULL, BZ NUMBER ( 4 )
); ALTER TABLE SC_DISTRICT ADD ( CONSTRAINT SC_DISTRICT_PK PRIMARY KEY (IID)); ALTER TABLE SC_DISTRICT ADD ( CONSTRAINT SC_DISTRICT_R01 FOREIGN KEY (PARENT_ID) REFERENCES SC_DISTRICT (IID));
INSERT INTO SC_DISTRICT(IID,INAME) VALUES ( 1 , ' 四川省 ' ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 2 , 1 , ' 巴中市 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 3 , 1 , ' 達州市 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 4 , 2 , ' 巴州區 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 5 , 2 , ' 通江縣 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 6 , 2 , ' 平昌縣 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 7 , 3 , ' 通川區 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 8 , 3 , ' 宣漢縣 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 9 , 8 , ' 塔河鄉 ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 10 , 8 , ' 三河鄉 ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 11 , 8 , ' 胡家鎮 ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 12 , 8 , ' 南壩鎮 ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 13 , 6 , ' 大寨鄉 ',2 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 14 , 6 , ' 響灘鎮 ',2 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 15 , 6 , ' 龍崗鎮 ',2 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 16 , 6 , ' 白衣鎮 ',2 );
如果如圖
?
--查詢平昌縣的子節點
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣'
CONNECT BY PRIOR IID = PARENT_ID
--查詢平昌縣的父節點
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣'
CONNECT BY PRIOR? PARENT_ID= IID
--只是查詢當前節點BZ為0的,但不會查詢節點BZ為0的子節點(這點大家注意了)
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣' AND BZ = 0
CONNECT BY PRIOR? PARENT_ID= IID ;
--查詢當前節點和子節點的BZ為0的方法
SELECT * FROM SC_DISTRICT WHERE BZ = 0
START WITH INAME = '平昌縣'
CONNECT BY PRIOR PARENT_ID= IID
--此方式不僅可以查詢BZ為0的節點而且會不再去遍歷此節點的子節點
SELECT * FROM SC_DISTRICT START WITH INAME = '平昌縣'
CONNECT BY PRIOR PARENT_ID= IID AND BZ = 0
如果大家對遞歸的方式比較了解的話上面的幾種方式就很容易理解了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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