共計 3142 個字符,預計需要花費 8 分鐘才能閱讀完成。
這篇文章主要為大家展示了“ORACLE 分層查詢 start with 和 connect by 怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“ORACLE 分層查詢 start with 和 connect by 怎么用”這篇文章吧。
分層查詢是 select 語句的擴展,目的是迅速找出表中列 - 列的隸屬關系。
19.1 樹的遍歷
ORACLE 是一個關系數據庫管理系統, 它用表的形式組織數據, 在某些表中的數據還呈現出樹型結構的聯系。例如,我們現在討論雇員信息表 EMP,其中含有雇員編號(EMPNO)和經理(MGR)兩列,通過這兩列反映出來的就是雇員之間領導和被領導的關系。他們之間的這種關系就是一種樹結構。
樹的遍歷有兩個方向
top–down 自上而下
即父親找兒子,一個父親可能有幾個兒子,一個兒子可能有幾個孫子,遍歷不能丟了兒子,順序以左為先。
down–top 自底向上
即兒子找父親,一個兒子只能有一個父親,所以順序應該是:孫子 - 兒子 – 父親 – 爺爺。
19.2 CONNECT BY 和 START WITH
在 SELECT 命令中使用 CONNECT BY 和 START WITH 子句可以查詢表中的樹型結構關系。其命令格式如下:
SELECT …
CONNECT BY {PRIOR 列名 1 = 列名 2 | 列名 1 =PRIOR 列名 2}
[START WITH];
19.3 關于 CONNECT BY 子句
理解 CONNECT BY PRIOR 子句至關重要,它確定了樹的檢索方向: 是 top — down(父 – 子)還是 down — top(子 – 父)。
在分層表中,表的父列與子列是確定的(身份固定),如:在 emp 表中 empno 是子列(下級),mgr 是父列(上級)。
RIOR 關鍵字就像一個箭頭 (—),
connect by prior empno = mgr
connect by mgr = prior empno
兩句語法等同,都是說 mgr(父)– empno(子),因此樹的檢索方向是 top — down。
connect by empno = prior mgr
connect by prior mgr = empno
兩句語法等同,都是說 empno(子)– mgr( 父),因此樹的檢索方向是 down — top。
19.4 START WITH 子句為可選項,用來標識哪個節點作為查找樹型結構的根節點。若該子句被省略,則表示所有滿足查詢條件的行作為根節點(每一行都會成為一個樹根)。
例 1 以樹結構方式顯示 EMP 表的數據。
SQL select empno,ename,mgr from emp connect by prior empno=mgr start with empno=7839;
仔細看 empno 這一列輸出的順序,就是上圖樹狀結構每一條分支(從根節點開始)的結構。
mgr(父)– empno(子),因此樹的檢索方向是 top — down。
例 2 從 SMITH 節點開始自底向上查找 EMP 的樹結構。
SQL select empno,ename,mgr
from emp
connect by empno=prior mgr
start with empno=7369
/
在這種自底向上的查找過程中,只有樹中的一枝被顯示。
empno(子)– mgr( 父),因此樹的檢索方向是 down — top
19.5 定義查找起始節點
在自頂向下查詢樹結構時,不但可以從根節點開始,還可以定義任何節點為起始節點,以此開始向下查找。這樣查找的結果就是以該節點為開始的結構樹的一枝。
例 3 查找 7566(JONES) 直接或間接領導的所有雇員信息。
SQL>SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH EMPNO=7566
/
START WITH 不但可以指定一個根節點,還可以指定多個根節點。
例 4 查找由 FORD 和 BLAKE 領導的所有雇員的信息。
SQL SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME IN (FORD , BLAKE)
/ 父親找兒子
19.6 使用 LEVEL
在查詢中,可以使用偽列 LEVEL 顯示每行數據的有關層次。LEVEL 將返回樹型結構中當前節點的層次。
偽列 LEVEL 為數值型,可以在 SELECT 命令中用于各種計算。
例 5 使用 LEVEL 改變查詢結果的顯示形式。
SQL COLUMN LEVEL FORMAT A20
SQL SELECT LPAD(LEVEL,LEVEL*3,)
as LEVEL ,EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME= KING
/
在 SELECT 使用了函數 LPAD,該函數表示以 LEVEL* 3 個空格進行填充,由于不同行處于不同的節點位置,具有不同的 LEVEL 值,因此填充的空格數將根據各自的層號確定,空格再與層號拼接,結果顯示出這種層次關系。
SQL select t1.* from (select level LNUM ,ename,mgr from emp connect by prior empno=mgr start with ename= KING) t1 where LNUM=2;
在對樹結構進行查詢時,可以去掉表中的某些行,也可以剪掉樹中的一個分支,使用 WHERE 子句來限定樹型結構中的單個節點,以去掉樹中的單個節點,但它卻不影響其后代節點(自頂向下檢索時)或前輩節點(自底向頂檢索時)。
SQL SELECT LPAD(LEVEL,LEVEL*3,)
as LEVEL ,EMPNO,ENAME,MGR
FROM EMP
WHERE ENAME SCOTT
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME= KING
/

例 8.顯示 KING 領導下的全體雇員信息,除去 SCOTT 領導的一支。
SQL SELECT LPAD(LEVEL,LEVEL*3,) as LEVEL ,EMPNO,ENAME,MGR FROM EMP CONNECT BY PRIOR EMPNO=MGR AND ENAME!= SCOTT START WITH ENAME= KING
/

這個查詢結果就除了剪去單個節點 SCOTT 外,還將 SCOTT 的子節點 ADAMS 剪掉,即把 SCOTT 這個分支剪掉了。
當然 WHERE 子句可以和 CONNECT BY 子句聯合使用,這樣能夠同時剪掉單個節點和樹中的某個分支。
例 9.顯示 KING 領導全體雇員信息,除去雇員 SCOTT,以及 BLAKE 領導的一支。
SCOTT@hyyk SELECT LPAD(LEVEL,LEVEL*3,) as LEVEL ,EMPNO,ENAME,MGR FROM EMP CONNECT BY PRIOR EMPNO=MGR AND ENAME!= SCOTT and ENAME!= BLAKE START WITH ENAME= KING
以上是“ORACLE 分層查詢 start with 和 connect by 怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!