在oracle中通過connect by prior來實現遞歸查詢[zt]
收集的幾條在oracle中通過 connect ? by ? prior 來實現遞歸查詢
?
Start with...
Connect
?
By
子句遞歸查詢一般用于一個表維護樹形結構的應用。
創建示例表:
CREATE TABLE TBL_TEST
(
ID??? NUMBER,
NAME VARCHAR2(100 BYTE),
PID?? NUMBER????????????????????????????????? DEFAULT 0
);
插入測試數據:
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往樹末梢遞歸
select * from TBL_TEST
start with id=1
connect
?
by
?
prior
?
id = pid
從末梢往樹ROOT遞歸
select * from TBL_TEST
start with id=5
connect
?
by
?
prior
?
pid = id
===============================================================================================================
有一張表?? t??
?
字段:??
?
parent??
?
child??
?
兩個字段的關系是父子關系??
?
???
?
寫一個sql語句,查詢出指定父下面的所有的子??
?
???
?
比如??
?
???
?
a?? b??
?
a?? c????
?
a?? e??
?
b?? b1??
?
b?? b2??
?
c?? c1??
?
e?? e1??
?
e?? e3??
?
d?? d1??
?
???
?
指定parent=a,選出??
?
a?? b??
?
a?? c????
?
a?? e??
?
b?? b1??
?
b?? b2??
?
c?? c1??
?
e?? e1??
?
e?? e3??
?
???
?
SQL語句:??
?
select?? parent,child?? from?? test?? start?? with?? parent='a'??
?
connect
??
?
by
??
?
prior
?? child=parent??
================================================================================================
connect
?
by
?
是結構化查詢中用到的,其基本語法是:
?
select ... from tablename start
?
by
?
cond1
?
connect
?
by
?
cond2
?
where cond3;
?
簡單說來是將一個樹狀結構存儲在一張表里,比如一個表中存在兩個字段:
?
id,parentid那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。
?
用上述語法的查詢可以取得這棵樹的所有記錄。
?
其中COND1是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。
?
COND2是連接條件,其中用
PRIOR
表示上一條記錄,比如
?
CONNECT
?
BY
?
PRIOR
?
ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。
?
COND3是過濾條件,用于對返回的所有記錄進行過濾。
PRIOR
和START WITH關鍵字是可選項
PRIORY運算符必須放置在連接關系的兩列中某一個的前面。對于節點間的父子關系,
PRIOR
運算符在一側表示父節點,在另一側表示子節點,從而確定查找樹結構是的順序是自頂向下還是
自底向上。在連接關系中,除了可以使用列名外,還允許使用列表達式。START WITH 子句為
可選項,用來標識哪個節點作為查找樹型結構的根節點。若該子句被省略,則表示所有滿足查詢
條件的行作為根節點。
完整的例子如SELECT PID,ID,NAME FROM T_WF_ENG_WFKIND START WITH PID =0
?
CONNECT
?
BY
?
PRIOR
?
ID = PID
以上主要是針對上層對下層的順向遞歸查詢而使用start with ...
?
connect
?
by
?
prior
?
...這種方式,但有時在需求需要的時候,可能會需要由下層向上層的逆向遞歸查詢,此是語句就有所變化:例如要實現 select * from table where id in ('0','01','0101','0203','0304') ;現在想把0304的上一級03給遞歸出來,0203的上一級02給遞歸出來,而01現在已經是存在的,最高層為0.而這張table不僅僅這些數據,但我現在只需要('0','01','0101','0203','0304','02','03')這些數據,此時語句可以這樣寫SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE
?
CONNECT
?
BY
?
PRIOR
?
PID = ID START WITH ID IN ('0','01','0101','0203','0304') );
其中START WITH ID IN里面的值也可以替換SELECT 子查詢語句.
注意由上層向下層遞歸與下層向上層遞歸的區別在于START WITH...
CONNECT
?
BY
?
PRIOR
...的先后順序以及 ID = PID 和 PID = ID 的微小變化!
?
?
====================================另一種說明法
Oracle中的select語句可以用start with...connect by prior子句實現遞歸查詢,connect by 是結構化查詢中用到的,其基本語法是:
select ... from <TableName>
where <Conditional-1>
start with <Conditional-2>
connect by <Conditional-3>;
<Conditional-1>:過濾條件,用于對返回的所有記錄進行過濾。
<Conditional-2>:查詢結果重起始根結點的限定條件。
<Conditional-3>:連接條件
數據組織結構如下圖:
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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