Oracle 10g 中的遞歸查詢(樹(shù)型查詢)
Oracle 10g 中的遞歸查詢(樹(shù)型查詢)
一、樹(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)值
節(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: 1,建立表結(jié)構(gòu)
create table Dept(
DepartNO varchar2(10),
DepartName varchar2(20),
TopNo varchar2(10)
);
DepartNO varchar2(10),
DepartName varchar2(20),
TopNo varchar2(10)
);
插入數(shù)據(jù):
insert into Dept values('001',' 董事會(huì)','0');
commit;
insert into Dept values('002','總裁辦 ','001');
commit;
insert into Dept values('003','財(cái)務(wù)部 ','001');
commit;
insert into Dept values('004','市場(chǎng)部 ','002');
commit;
insert into Dept values('005','公關(guān)部 ','002');
commit;
insert into Dept values('006','銷(xiāo)售部 ','002');
commit;
insert into Dept values('007','分銷(xiāo)處 ','006');
commit;
insert into Dept values('008','業(yè)務(wù)拓展處','004');
commit;
insert into Dept values('009','銷(xiāo)售科','007');
commit;
commit;
insert into Dept values('002','總裁辦 ','001');
commit;
insert into Dept values('003','財(cái)務(wù)部 ','001');
commit;
insert into Dept values('004','市場(chǎng)部 ','002');
commit;
insert into Dept values('005','公關(guān)部 ','002');
commit;
insert into Dept values('006','銷(xiāo)售部 ','002');
commit;
insert into Dept values('007','分銷(xiāo)處 ','006');
commit;
insert into Dept values('008','業(yè)務(wù)拓展處','004');
commit;
insert into Dept values('009','銷(xiāo)售科','007');
commit;
1,向前查 (從查詢本身一直到最上面的機(jī)構(gòu))
比如:
select distinct departno,departname,level
from dept
connect by prior topno=departno
start with
departno='005';
select distinct departno,departname,level
from dept
connect by prior topno=departno
start with
departno='005';
2,向后查:(從查詢本身一直到最下面的機(jī)構(gòu))
select distinct departno,departname,level
from dept
connect by prior departno=topno
start with
topno='001';
from dept
connect by prior departno=topno
start with
topno='001';
COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說(shuō)上一條記錄的ID(比如根記錄)是(下一條)本條記錄的PRAENTID,即本記錄的父親是上一條記錄。
posted on 2009-04-21 15:30 百科 閱讀(184) 評(píng)論(0) 編輯 收藏