既然會(huì)看ORACLE遞歸查詢那么大家應(yīng)該是比較清楚遞歸是什么意思了,在這里我就不多加說(shuō)明了,只作簡(jiǎn)單介紹了。
言歸正傳所謂遞歸查詢那么數(shù)據(jù)表中數(shù)據(jù)的結(jié)構(gòu)應(yīng)該是符合遞歸查詢的基本條件,即表中有ID,PID(節(jié)點(diǎn)編號(hào)、父節(jié)點(diǎn)編號(hào))如果把數(shù)據(jù)以UI的方式展現(xiàn)出來(lái)應(yīng)該是一棵或多棵樹了。
那么我們要以其中一個(gè)節(jié)點(diǎn)去遞歸查詢出這個(gè)節(jié)點(diǎn)子節(jié)點(diǎn)或父節(jié)點(diǎn)的過程就是我們所要說(shuō)明的。
遞歸查詢語(yǔ)法:
?
select ... from tablename? where 條件4 start with 條件1? connect by 條件2?AND 條件3
?
如下面的表結(jié)構(gòu) 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 , ' 達(dá)州市 ',0 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 4 , 2 , ' 巴州區(qū) ',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 , ' 通川區(qū) ',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 , ' 塔河鄉(xiāng) ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 10 , 8 , ' 三河鄉(xiāng) ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 11 , 8 , ' 胡家鎮(zhèn) ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 12 , 8 , ' 南壩鎮(zhèn) ',1 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 13 , 6 , ' 大寨鄉(xiāng) ',2 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 14 , 6 , ' 響灘鎮(zhèn) ',2 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 15 , 6 , ' 龍崗鎮(zhèn) ',2 ); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES ( 16 , 6 , ' 白衣鎮(zhèn) ',2 );
如果如圖
?
--查詢平昌縣的子節(jié)點(diǎn)
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣'
CONNECT BY PRIOR IID = PARENT_ID
--查詢平昌縣的父節(jié)點(diǎn)
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣'
CONNECT BY PRIOR? PARENT_ID= IID
--只是查詢當(dāng)前節(jié)點(diǎn)BZ為0的,但不會(huì)查詢節(jié)點(diǎn)BZ為0的子節(jié)點(diǎn)(這點(diǎn)大家注意了)
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣' AND BZ = 0
CONNECT BY PRIOR? PARENT_ID= IID ;
--查詢當(dāng)前節(jié)點(diǎn)和子節(jié)點(diǎn)的BZ為0的方法
SELECT * FROM SC_DISTRICT WHERE BZ = 0
START WITH INAME = '平昌縣'
CONNECT BY PRIOR PARENT_ID= IID
--此方式不僅可以查詢BZ為0的節(jié)點(diǎn)而且會(huì)不再去遍歷此節(jié)點(diǎn)的子節(jié)點(diǎn)
SELECT * FROM SC_DISTRICT START WITH INAME = '平昌縣'
CONNECT BY PRIOR PARENT_ID= IID AND BZ = 0
如果大家對(duì)遞歸的方式比較了解的話上面的幾種方式就很容易理解了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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