Oracle層次化查詢學習總結,oracle層次

來源:互聯網
上載者:User

Oracle層次化查詢學習總結,oracle層次
層次化查詢 文檔目錄:

1.1 概要 21.2 節點術語 21.3 使用CONNECT BY 和 START WITH子句31.4 層次查詢執行個體   31.5 從下向上查詢   41.6 從層次查詢中刪除節點和分支5
文檔地址:
http://wenku.baidu.com/view/324fb47a700abb68a982fbd1

本文

備忘:圖片無法顯示,請到文庫查看

本文地址:http://blog.csdn.net/sunansheng/article/details/46492299


1.       層次化查詢1.1 概要

        我們經常可以見到組織為層次的資料,比如一個公司的工作的人員就構成了一個層次,這個層次可以使用樹的形式來表示。例如Oracle的表scott.emp,就可以使用如下的樹來表示:

下面是查詢scott.emp表返回的行:

        其中MGR列是一個自引用列,它指回EMPNO列。MGR表示一個員工的管理者或者上級。在ORACLE中可以使用CONNECT BY 和 START WITH子句來查詢這種階層的資料。

1.2 節點術語

        如所示,這些元素構成了一棵樹。有關節點構成樹有一些技術術語,如下:

1)       根節點:根節點是位於樹頂端的節點。如所示,根節點是“KING”。

2)       父節點:父節點的下面有一個或多個節點。

3)       子節點:子節點上面有一個父節點。

4)       分葉節點:分葉節點是沒有子節點的節點。

 

1.3 使用CONNECT BY 和 START WITH子句

SELECT語句的CONNECT BY 和 START WITH  子句的文法如下:

 

SELECT [LEVEL],column...

FROM TABLE

[WHERE where_condition]

[[START WITH start_condition] [CONNECT BY PRIOR prior_condition]]

 

其中:

l  LEVEL:是一個”偽列”,代表樹的第幾層。對於根節點來說,LEVEL為1,根節點的子節點層次為2…

l  start_condition :定義了層次化查詢的起點。層次化查詢必須指定 START WITH 子句。例如,可以指定 start_condition 定義為 EMPNO=7839 (KING),代表從KING 開始查詢。

l  prior_condition:定義了父行與子行的關係。當編寫層次化查詢時必須定義CONNECT BY PRIOR子句。例如,可以將prior_condition定義為ENPNO=MGR,表示父節點的 ENPNO 和子節點的MGR 之間存在關係,也就是說,子節點的 MGR 指向父節點的 ENPNO 。其中跟在PRIOR 關鍵字後面的代表父節點。

1.4 層次查詢執行個體

1)       查詢EMP表的層次關係。查詢“JONES “下面的員工

SELECT e.empno,

       e.mgr,

       e.ename

  FROM scott.emp e

 START WITH e.ename = 'JONES'

CONNECT BY PRIOR e.empno = e.mgr

 

查詢結果:

EMPNO   MGR ENAME

----- ----- ----------

 7566  7839 JONES

 7788  7566 SCOTT

 7876  7788 ADAMS

 7902  7566 FORD

 7369  7902 SMITH

預期結果:

                  

2)       使用偽列 LEVEL

SELECT LEVEL,

       e.empno,

       e.mgr,

       e.ename

  FROM scott.emp e

 START WITH e.ename = 'JONES'

CONNECT BY PRIOR e.empno = e.mgr

 

查詢結果:

     LEVEL EMPNO   MGR ENAME

---------- ----- ----- ----------

         1  7566  7839 JONES

         2  7788  7566 SCOTT

         3  7876  7788 ADAMS

         2  7902  7566 FORD

         3  7369  7902 SMITH

 

1.5 從下向上查詢

        不一定非要按照從父節點到子節點的順序從上至下遍曆樹;也可以從某個子節點開始,從下而上遍曆。實現的方法是交換父節點和子節點在CONNECT BY PRIOR子句中的順序。例如,CONNECT BY PRIOR mgr = empno 可以將子節點的 mgr 串連到父節點的 empno 上。

--從分葉節點”SMITH”,從下向上查詢到根節點:

SELECT LEVEL,

       e.empno,

       e.mgr,

       e.ename

  FROM scott.emp e

 START WITH e.ename = 'SMITH'

CONNECT BY PRIOR e.mgr = e.empno;

 

查詢結果:

     LEVEL EMPNO   MGR ENAME

---------- ----- ----- ----------

         1  7369  7902 SMITH

         2  7902  7566 FORD

         3  7566  7839 JONES

         4  7839       KING

 

1.6 從層次查詢中刪除節點和分支

1.       刪除節點

可以用WHERE子句從查詢樹中除去某個特定的節點,下面這個查詢使用WHERE e.ename != 'FORD'子句從結果中除去FORD

 

SELECT LEVEL,

       e.empno,

       e.mgr,

       e.ename

  FROM scott.emp e

 WHERE e.ename != 'SCOTT'

 START WITH e.ename = 'JONES'

CONNECT BY PRIOR e.empno = e.mgr;

 

查詢結果:

     LEVEL EMPNO   MGR ENAME

---------- ----- ----- ----------

         1  7566  7839 JONES

         3  7876  7788 ADAMS

         2  7902  7566 FORD

         3  7369  7902 SMITH

  可以看到,儘管  SCOTT 已經從結果中除去了,但是他的下屬 ADAMS 仍然在結果中。為了將整個分支都從查詢結果中除去,可以再CONNECT BY PRIOR子句中使用AND 子句。例如下面這個例子使用AND  e.ename != 'SCOTT' 將SCOTT及其所有下屬從結果中除去

2.       刪除分支

 

SELECT LEVEL,

       e.empno,

       e.mgr,

       e.ename

  FROM scott.emp e

 START WITH e.ename = 'JONES'

CONNECT BY PRIOR e.empno = e.mgr

       AND e.ename != 'SCOTT';

 

查詢結果:

     LEVEL EMPNO   MGR ENAME

---------- ----- ----- ----------

         1  7566  7839 JONES

         2  7902  7566 FORD

         3  7369  7902 SMITH


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.