一個(gè)Oracle遞歸查詢的實(shí)例代碼分析
Oracle數(shù)據(jù)庫(kù)的遞歸查詢用途非常的廣泛,我們做遞歸查詢首先要定義好遞歸函數(shù),以及它的參數(shù)和返回值,然后實(shí)現(xiàn)查詢。本文通過(guò)一個(gè)代碼的實(shí)例講解介紹了這一過(guò)程,接下來(lái)我們就開(kāi)始介紹。
一、樹(shù)型表結(jié)構(gòu):
節(jié)點(diǎn)ID 上級(jí)ID 節(jié)點(diǎn)名稱
二、公式:
- select 節(jié)點(diǎn)ID,節(jié)點(diǎn)名稱,level
- from 表
- connect by prior 節(jié)點(diǎn)ID=上級(jí)節(jié)點(diǎn)ID
- start with 上級(jí)節(jié)點(diǎn)ID=節(jié)點(diǎn)值
說(shuō)明:
1、常見(jiàn)的樹(shù)形結(jié)構(gòu)為公司組織機(jī)構(gòu)、地區(qū)……
2、求節(jié)點(diǎn)ID以上的結(jié)構(gòu),或以上的結(jié)構(gòu),將“節(jié)點(diǎn)ID=上級(jí)節(jié)點(diǎn)ID”左右順序換一下即可。
3、Level為Oracle的特殊字段,表示“層”的意思。當(dāng)前節(jié)點(diǎn)ID的下一層節(jié)點(diǎn)為“1”。
測(cè)試SQL:
說(shuō)明1、求002以下(或以上)所有子節(jié)點(diǎn)和層次(動(dòng)態(tài):總是從1開(kāi)始算),但不包括自身。
說(shuō)明2、如果求002以上的節(jié)點(diǎn),則“connect by prior topno=departno”,“=”兩邊的條件換位即可。
- select departno,departname,level
- from dept
- connect by prior departno=topno
- start with topno='002';
測(cè)試數(shù)據(jù):
- create table Dept(
- DepartNO varchar2(10),
- DepartName varchar2(20),
- TopNo varchar2(10));
- insert into Dept values('001',' 董事會(huì)','0');
- insert into Dept values('002','總裁辦 ','001');
- insert into Dept values('003','財(cái)務(wù)部 ','001');
- insert into Dept values('004','市場(chǎng)部 ','002');
- insert into Dept values('005','公關(guān)部 ','002');
- insert into Dept values('006','銷售部 ','002');
- insert into Dept values('007','分銷處 ','006');
- insert into Dept values('008','業(yè)務(wù)拓展處','004');
- insert into Dept values('009','銷售科','007');
向前查,比如:
- select distinct departno,departname,level
- from dept
- connect by prior topno=departno
- start with
- departno='005';
那么其實(shí)是查005自身以及上級(jí), 所以結(jié)果是005,002,001。
總結(jié):寫(xiě)遞歸最關(guān)鍵的要定義出來(lái)遞歸函數(shù),遞歸函數(shù)最關(guān)鍵的要定義出來(lái)它的參數(shù)和它的返回值。參數(shù)最重要,分析一下參數(shù)怎么去定義?這時(shí)候要分析遞歸的過(guò)程,遞歸過(guò)程什么樣呢?根據(jù)它的id 找它的父id,根據(jù)它的父id 找到它的孩子,根據(jù)它的孩子再找到它的孩子。那么分析這個(gè)參數(shù)肯定是一個(gè)id,因?yàn)橹挥袀鬟M(jìn)來(lái)id,才知道怎么去找這個(gè)id。
關(guān)于Oracle數(shù)據(jù)庫(kù)的遞歸查詢就介紹這么多,謝謝各位一直以來(lái)的支持!
【編輯推薦】