既然會(huì)看ORACLE遞歸查詢(xún)那么大家應(yīng)該是比較清楚遞歸是什么意思了,在這里我就不多加說(shuō)明了,只作簡(jiǎn)單介紹了。
言歸正傳所謂遞歸查詢(xún)那么數(shù)據(jù)表中數(shù)據(jù)的結(jié)構(gòu)應(yīng)該是符合遞歸查詢(xún)的基本條件,即表中有ID,PID(節(jié)點(diǎn)編號(hào)、父節(jié)點(diǎn)編號(hào))如果把數(shù)據(jù)以UI的方式展現(xiàn)出來(lái)應(yīng)該是一棵或多棵樹(shù)了。
那么我們要以其中一個(gè)節(jié)點(diǎn)去遞歸查詢(xún)出這個(gè)節(jié)點(diǎn)子節(jié)點(diǎn)或父節(jié)點(diǎn)的過(guò)程就是我們所要說(shuō)明的。
遞歸查詢(xún)語(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
);
如果如圖
?
--查詢(xún)平昌縣的子節(jié)點(diǎn)
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣'
CONNECT BY PRIOR IID = PARENT_ID
--查詢(xún)平昌縣的父節(jié)點(diǎn)
SELECT * FROM SC_DISTRICT
START WITH INAME = '平昌縣'
CONNECT BY PRIOR? PARENT_ID= IID
--只是查詢(xún)當(dāng)前節(jié)點(diǎn)BZ為0的,但不會(huì)查詢(xún)節(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 ;
--查詢(xún)當(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
--此方式不僅可以查詢(xún)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ì)遞歸的方式比較了解的話(huà)上面的幾種方式就很容易理解了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

