日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

connect by prior start with

系統(tǒng) 1691 0

在oracle中通過connect by prior來實現(xiàn)遞歸查詢[zt]


收集的幾條在oracle中通過 connect ? by ? prior 來實現(xiàn)遞歸查詢

?

Start with... Connect ? By 子句遞歸查詢一般用于一個表維護樹形結(jié)構(gòu)的應(yīng)用。
創(chuàng)建示例表:
CREATE TABLE TBL_TEST
(
ID??? NUMBER,
NAME VARCHAR2(100 BYTE),
PID?? NUMBER????????????????????????????????? DEFAULT 0
);

插入測試數(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往樹末梢遞歸
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?? ?
兩個字段的關(guān)系是父子關(guān)系?? ?
??? ?
寫一個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 ? 是結(jié)構(gòu)化查詢中用到的,其基本語法是: ?
select ... from tablename start ? by ? cond1 ?
connect ? by ? cond2 ?
where cond3; ?
簡單說來是將一個樹狀結(jié)構(gòu)存儲在一張表里,比如一個表中存在兩個字段: ?
id,parentid那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結(jié)構(gòu)。 ?
用上述語法的查詢可以取得這棵樹的所有記錄。 ?
其中COND1是根結(jié)點的限定語句,當(dāng)然可以放寬限定條件,以取得多個根結(jié)點,實際就是多棵樹。 ?
COND2是連接條件,其中用 PRIOR 表示上一條記錄,比如 ? CONNECT ? BY ? PRIOR ? ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。 ?
COND3是過濾條件,用于對返回的所有記錄進行過濾。

PRIOR 和START WITH關(guān)鍵字是可選項
PRIORY運算符必須放置在連接關(guān)系的兩列中某一個的前面。對于節(jié)點間的父子關(guān)系, PRIOR
運算符在一側(cè)表示父節(jié)點,在另一側(cè)表示子節(jié)點,從而確定查找樹結(jié)構(gòu)是的順序是自頂向下還是
自底向上。在連接關(guān)系中,除了可以使用列名外,還允許使用列表達式。START WITH 子句為
可選項,用來標(biāo)識哪個節(jié)點作為查找樹型結(jié)構(gòu)的根節(jié)點。若該子句被省略,則表示所有滿足查詢
條件的行作為根節(jié)點。
完整的例子如SELECT PID,ID,NAME FROM T_WF_ENG_WFKIND START WITH PID =0 ? CONNECT ? BY ? PRIOR ? ID = PID


以上主要是針對上層對下層的順向遞歸查詢而使用start with ... ? connect ? by ? prior ? ...這種方式,但有時在需求需要的時候,可能會需要由下層向上層的逆向遞歸查詢,此是語句就有所變化:例如要實現(xiàn) select * from table where id in ('0','01','0101','0203','0304') ;現(xiàn)在想把0304的上一級03給遞歸出來,0203的上一級02給遞歸出來,而01現(xiàn)在已經(jīng)是存在的,最高層為0.而這張table不僅僅這些數(shù)據(jù),但我現(xiàn)在只需要('0','01','0101','0203','0304','02','03')這些數(shù)據(jù),此時語句可以這樣寫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 子查詢語句.


注意由上層向下層遞歸與下層向上層遞歸的區(qū)別在于START WITH... CONNECT ? BY ? PRIOR ...的先后順序以及 ID = PID 和 PID = ID 的微小變化!

?

?

====================================另一種說明法

Oracle中的select語句可以用start with...connect by prior子句實現(xiàn)遞歸查詢,connect by 是結(jié)構(gòu)化查詢中用到的,其基本語法是:

select ... from <TableName>
where <Conditional-1>
start with <Conditional-2>
connect by <Conditional-3>;

<Conditional-1>:過濾條件,用于對返回的所有記錄進行過濾。
<Conditional-2>:查詢結(jié)果重起始根結(jié)點的限定條件。
<Conditional-3>:連接條件

數(shù)據(jù)組織結(jié)構(gòu)如下圖:

?

?

connect by prior start with


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 鄂尔多斯市| 枣庄市| 县级市| 册亨县| 拉孜县| 平山县| 南京市| 高青县| 涿州市| 棋牌| 伊通| 长顺县| 禹州市| 涟水县| 健康| 鹤山市| 蚌埠市| 土默特右旗| 广宗县| 岳普湖县| 黄平县| 满洲里市| 巴塘县| 兴安盟| 井研县| 镇原县| 临邑县| 南澳县| 孟村| 九龙城区| 锡林浩特市| 凤阳县| 寻乌县| 海南省| 永泰县| 调兵山市| 闻喜县| 平安县| 彝良县| 贵定县| 延寿县|