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: 指定起始節點的條件connect by: 指定父子行的條件關系prior: 查詢父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and ... ,nocycle: 若數據表中存在循環行,那么不添加此關鍵字會報錯,添加關鍵字后,便不會報錯,但循環的兩行只會顯示其中的第一條循環行: 該行只有一個子行,而且子行又是該行的祖先行connect_by_iscycle: 前置條件:在使用了nocycle之后才能使用此關鍵字,用于表示是否是循環行,0表示否,1 表示是connect_by_isleaf: 是否是葉子節點,0表示否,1 表示是level: level偽列,表示層級,值越小層級越高,level=1為層級最高節點二、使用
oracle的start with connect by prior是根據條件遞歸查詢"樹",分為四種使用情況:
第一種:查詢結果自己所有的后代節點(包括自己)
start with 子節點ID='...' connect by prior 子節點ID = 父節點IDselect * from mdm_organization o start with o.org_code='10000008' connect by prior o.org_code=o.org_parent_code按照條件org_code='10000008',對'10000008'(包括自己)及其子節點進行遞歸查詢,結果如下:
第二種:查詢結果自己所有的前代節點(包括自己)
start with 子節點ID='...' connect by 子節點ID = prior 父節點IDselect * from mdm_organization o start with o.org_code='10000008' connect by o.org_code=prior o.org_parent_code按照條件org_code='10000008',對'10000008'(包括自己)及其父節點進行遞歸查詢,結果如下:
第三種:查詢結果自己所有的后代節點(不包括自己)
start with 父節點ID='...' connect by prior 子節點ID = 父節點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',對'10000008'(不包括自己)子節點進行遞歸查詢,結果如下:
第四種:查詢結果自己的第一代后節點和所有的前代節點(包括自己)
start with 父節點ID='...' connect by 子節點ID = prior 父節點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',對'10000008'(包括自己)的第一代孩子們及其父節點進行遞歸查詢,結果如下:
如果有where 條件,如下:
select * from mdm_organization o where 條件 start with o.org_parent_code='10000008' connect by o.org_code = prior o.org_parent_code執行順序為先執行start with connect by prior,然后再按照where條件進行過濾。
該部分參考(oracle的start with connect by prior如何使用),具體請前往查看。
三、函數
1、sys_connect_by_path函數
語法:sys_connect_by_path(列名, '分隔符')。
作用:從start with的地方開始遍歷,將遍歷到的路徑根據函數中的分隔符,組成一個新的字符串。
sys_connect_by_path函數使用的一個小技巧,把查詢行轉換成列,把表emp的所有列名以'|'分隔開輸出(提示:大家可以把下面的語句拆開來逐個分析),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函數
在結構化查詢結果中,每一行都是結構中的一個節點,level表示該節點在結構中的層次,根節點為1,根節點的子節點為2,以此類推。
下面SQL語句很直觀的展示效果:
3、connect_by_root函數
用在列名之前,返回當前節點的根節點對應列的值。
下面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函數
返回當前節點是否為葉子節點,“是”返回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高級查詢之CONNECT BY),具體請前往查看。
隨時用到,隨時待續。。。
總結
以上是生活随笔為你收集整理的Oracle系列:start with connect by prior 使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle ASM理论及实践介绍
- 下一篇: 小学生毕业演讲稿