Oracle中Start with...Connect By實(shí)現(xiàn)部門多級(jí)遞歸理解及用法
其基本語(yǔ)法是:
select ... from tablename start with cond1
connect by cond2
where cond3;
簡(jiǎn)單說(shuō)來(lái)是將一個(gè)樹(shù)狀結(jié)構(gòu)存儲(chǔ)在一張表里,比如一個(gè)表中存在兩個(gè)字段: id,parentid,那么通過(guò)表示每一條記錄的parent是誰(shuí),就可以形成一個(gè)樹(shù)狀結(jié)構(gòu)。用上述語(yǔ)法的查詢可以取得這棵樹(shù)的所有記錄。
其中COND1是根結(jié)點(diǎn)的限定語(yǔ)句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹(shù)。
COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說(shuō)上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄
COND3是過(guò)濾條件,用于對(duì)返回的所有記錄進(jìn)行過(guò)濾
例子:
創(chuàng)建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
插入測(cè)試數(shù)據(jù):
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
從Root往樹(shù)末梢遞歸(取所有點(diǎn))
select * from TBL_TEST
start with id=1
connect by prior id = pid
從末梢往樹(shù)ROOT遞歸(只取根結(jié)點(diǎn),根結(jié)點(diǎn)的根結(jié)點(diǎn)......)
select * from TBL_TEST
start with id=5
connect by prior pid = id
注:
prior 寫(xiě)在哪個(gè)字段那邊,那么就用start with 這條記錄的該項(xiàng)值 與 別的記錄的另一個(gè)字段的值去關(guān)聯(lián);
start with 可以不寫(xiě),默認(rèn)為所有記錄
例如
select * from TBL_TEST
start with id=5
connect by prior pid = id
因?yàn)閜id=2 與id=5 在本數(shù)據(jù)表中為同一條數(shù)據(jù), 因此可以理解為:
select * from TBL_TEST
start with pid=2
connect by prior pid = id (個(gè)人認(rèn)為這樣更好理解)
****************************************************
此語(yǔ)句可以直接分層次顯示
SELECT lpad('|-',(level-1)*4,'|-')||lpad('『',2)||di_name||rpad('』',2)
di_name,di_id
FROM t_dictionary_link CONNECT BY PRIOR di_id=di_protypeid
START WITH di_id=-1
|-|-『公司架構(gòu)』 2
|-|-|-|-『芯碼科技』 3
|-|-|-|-|-|-『開(kāi)發(fā)部』 4
|-|-|-|-|-|-|-|-『JAVA組』 11
|-|-|-|-|-|-|-|-『.NET組』 102
|-|-|-|-|-|-『銷售部』 261
|-|-|-|-|-|-『客服部』
對(duì)各階層記錄排序使用
ORDER SIBLINGS BY ID
posted on 2010-05-23 23:02
藍(lán)劍 閱讀(1758)
評(píng)論(0) 編輯 收藏 所屬分類:
Oracle