黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

connect by prior start with

系統(tǒng) 1922 0

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


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

?

Start with... Connect ? By 子句遞歸查詢一般用于一個表維護(hù)樹形結(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是過濾條件,用于對返回的所有記錄進(jìn)行過濾。

PRIOR 和START WITH關(guān)鍵字是可選項
PRIORY運算符必須放置在連接關(guān)系的兩列中某一個的前面。對于節(jié)點間的父子關(guān)系, PRIOR
運算符在一側(cè)表示父節(jié)點,在另一側(cè)表示子節(jié)點,從而確定查找樹結(jié)構(gòu)是的順序是自頂向下還是
自底向上。在連接關(guān)系中,除了可以使用列名外,還允許使用列表達(dá)式。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>:過濾條件,用于對返回的所有記錄進(jìn)行過濾。
<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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論