Oracle系列:start with connect by prior 使用方法
一、語法
{ 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è)新的字符串。
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語句很直觀的展示效果:
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle ASM理论及实践介绍
- 下一篇: 小学生毕业演讲稿