日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle系列:start with connect by prior 使用方法

發(fā)布時(shí)間:2024/3/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle系列:start with connect by prior 使用方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、語法

{ CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ] | START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...}解釋:start with: 指定起始節(jié)點(diǎn)的條件connect by: 指定父子行的條件關(guān)系prior: 查詢父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and ... ,nocycle: 若數(shù)據(jù)表中存在循環(huán)行,那么不添加此關(guān)鍵字會(huì)報(bào)錯(cuò),添加關(guān)鍵字后,便不會(huì)報(bào)錯(cuò),但循環(huán)的兩行只會(huì)顯示其中的第一條循環(huán)行: 該行只有一個(gè)子行,而且子行又是該行的祖先行connect_by_iscycle: 前置條件:在使用了nocycle之后才能使用此關(guān)鍵字,用于表示是否是循環(huán)行,0表示否,1 表示是connect_by_isleaf: 是否是葉子節(jié)點(diǎn),0表示否,1 表示是level: level偽列,表示層級(jí),值越小層級(jí)越高,level=1為層級(jí)最高節(jié)點(diǎn)

二、使用

oracle的start with connect by prior是根據(jù)條件遞歸查詢"樹",分為四種使用情況:

第一種:查詢結(jié)果自己所有的后代節(jié)點(diǎn)(包括自己)

start with 子節(jié)點(diǎn)ID='...' connect by prior 子節(jié)點(diǎn)ID = 父節(jié)點(diǎn)IDselect * from mdm_organization o start with o.org_code='10000008' connect by prior o.org_code=o.org_parent_code

按照條件org_code='10000008',對(duì)'10000008'(包括自己)及其子節(jié)點(diǎn)進(jìn)行遞歸查詢,結(jié)果如下:

第二種:查詢結(jié)果自己所有的前代節(jié)點(diǎn)(包括自己)

start with 子節(jié)點(diǎn)ID='...' connect by 子節(jié)點(diǎn)ID = prior 父節(jié)點(diǎn)IDselect * from mdm_organization o start with o.org_code='10000008' connect by o.org_code=prior o.org_parent_code

按照條件org_code='10000008',對(duì)'10000008'(包括自己)及其父節(jié)點(diǎn)進(jìn)行遞歸查詢,結(jié)果如下:

第三種:查詢結(jié)果自己所有的后代節(jié)點(diǎn)(不包括自己)

start with 父節(jié)點(diǎn)ID='...' connect by prior 子節(jié)點(diǎn)ID = 父節(jié)點(diǎn)IDselect * from mdm_organization o start with o.org_parent_code='10000008' connect by prior o.org_code=o.org_parent_code

按照條件org_parent_code='10000008',對(duì)'10000008'(不包括自己)子節(jié)點(diǎn)進(jìn)行遞歸查詢,結(jié)果如下:

第四種:查詢結(jié)果自己的第一代后節(jié)點(diǎn)和所有的前代節(jié)點(diǎn)(包括自己)

start with 父節(jié)點(diǎn)ID='...' connect by 子節(jié)點(diǎn)ID = prior 父節(jié)點(diǎn)IDselect * from mdm_organization o start with o.org_parent_code='10000008' connect by o.org_code = prior o.org_parent_cod

按照條件org_parent_code='10000008',對(duì)'10000008'(包括自己)的第一代孩子們及其父節(jié)點(diǎn)進(jìn)行遞歸查詢,結(jié)果如下:

如果有where 條件,如下:

select * from mdm_organization o where 條件 start with o.org_parent_code='10000008' connect by o.org_code = prior o.org_parent_code

執(zhí)行順序?yàn)橄葓?zhí)行start with connect by prior,然后再按照where條件進(jìn)行過濾。

該部分參考(oracle的start with connect by prior如何使用),具體請(qǐng)前往查看。

三、函數(shù)

1、sys_connect_by_path函數(shù)

語法:sys_connect_by_path(列名, '分隔符')。
作用:從start with的地方開始遍歷,將遍歷到的路徑根據(jù)函數(shù)中的分隔符,組成一個(gè)新的字符串。

select sys_connect_by_path(ename, '/') ename_tree from scott.empstart with ename = 'KING'connect by mgr = prior empno;

sys_connect_by_path函數(shù)使用的一個(gè)小技巧,把查詢行轉(zhuǎn)換成列,把表emp的所有列名以'|'分隔開輸出(提示:大家可以把下面的語句拆開來逐個(gè)分析),SQL語句如下:

select max(ltrim(sys_connect_by_path(column_name, '|'), '|')) column_names from (select column_name, rownum rnumfrom user_tab_columnswhere table_name = 'EMP')start with rnum = 1 connect by rnum = rownum;

2、level函數(shù)

在結(jié)構(gòu)化查詢結(jié)果中,每一行都是結(jié)構(gòu)中的一個(gè)節(jié)點(diǎn),level表示該節(jié)點(diǎn)在結(jié)構(gòu)中的層次,根節(jié)點(diǎn)為1,根節(jié)點(diǎn)的子節(jié)點(diǎn)為2,以此類推。
下面SQL語句很直觀的展示效果:

select ename, sys_connect_by_path(ename, '/') ename_tree, levelfrom scott.empstart with ename = 'KING' connect by mgr = prior empno;

3、connect_by_root函數(shù)

用在列名之前,返回當(dāng)前節(jié)點(diǎn)的根節(jié)點(diǎn)對(duì)應(yīng)列的值。

下面SQL語句很直觀的展示效果:

select connect_by_root ename as root from scott.emp e start with e.ename = 'KING' connect by prior e.empno = e.mgr;

4、connect_by_isleaf函數(shù)

返回當(dāng)前節(jié)點(diǎn)是否為葉子節(jié)點(diǎn),“是”返回1,“否”返回0。

下面SQL語句很直觀的展示效果:

select connect_by_isleaf as isleaf from scott.emp e start with e.ename = 'KING' connect by prior e.empno = e.mgr;

該部分參考(Oracle高級(jí)查詢之CONNECT BY),具體請(qǐng)前往查看。


隨時(shí)用到,隨時(shí)待續(xù)。。。

總結(jié)

以上是生活随笔為你收集整理的Oracle系列:start with connect by prior 使用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。