oracle樹中prior的用法

space6212發表於2018-12-27

在oracle生成樹時,prior起了至關重要的作用,它決定了書的遍歷方向。下面用例子分別闡述之:


1、prior放在子節點方向

scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 CONNECT BY PRIOR EMPNO=MGR
4* START WITH ENAME='JONES'
scott@ORA9I> /

EMPLOYEE
------------------------------------------------------------
JONES
JONES->SCOTT
JONES->SCOTT->ADAMS
JONES->FORD
JONES->FORD->SMITH
--從上面可以看出,如果prior放在子節點方向,則oracle會根據start with指定的節點作為根節點,從上往下遍歷基於指定節點的所有分支。它可能會對應多個分支。
--如果不指定start with,則oracle會把所有的節點都當成根節點分別往下遍歷。

--用以下方法檢視以JONES為根節點的所有完整的分支
scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 WHERE EMPNO NOT IN (SELECT MGR FROM EMP WHERE MGR IS NOT NULL)
4 CONNECT BY PRIOR EMPNO=MGR
5* START WITH ENAME='JONES'
scott@ORA9I> /

EMPLOYEE
------------------------------------------------------------
JONES->SCOTT->ADAMS
JONES->FORD->SMITH

2、prior放在父節點方向

scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 CONNECT BY PRIOR MGR=EMPNO
4* START WITH ENAME='JONES'
scott@ORA9I> /

EMPLOYEE
------------------------------------------------------------
JONES
JONES->KING
--從以上結果可以看出,當prior放在父節點端時,oracle會根據start with執行的節點作為子節點,從下往上找其對應的父節點,然後再根據找到的父節點找父節點的父節點,依此類推,直到找到根節點為止。
--我們也不難知道,這種情況下只可能有一個分支。

--用以下方法檢視以JONES為最低層子節點的完整的分支
scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 WHERE MGR IS NULL
4 CONNECT BY PRIOR MGR=EMPNO
5* START WITH ENAME='JONES'
scott@ORA9I> /

EMPLOYEE
------------------------------------------------------------
JONES->KING



總結:
1)prior放在子節點端,則表示掃描樹是以start with指定的節點作為根節點從上往下掃描。可能對應一個或多個分支。
start with可以省略,如果省略,表示對所有節點都當成根節點分別進行遍歷
2)prior放在父節點端,則表示掃描樹是以start with指定的節點作為最低層子節點,從下往上掃描。順序是子節點往父節點掃描,直到根節點為止,這種情況只能得到一個分支。
start with可以省略,如果省略,表示對所有節點都當成最低層子節點分別往根節點方向遍歷

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63790/,如需轉載,請註明出處,否則將追究法律責任。

相關文章