2013/08/30

12-02.階層クエリの活用

Oracle10gからCONNECT BYで提供するCONNECT_BY_ROOT, SYS_CONNECT_BY_PATH, CONNECT_BY_ISLEAF機能について…

■CONNECT_BY_ROOT
 ・階層構造クエリでLEVELが0の最上位ROWの情報を取得できる。

SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
  2  CONNECT_BY_ROOT empno "Root empno", level
  3  FROM emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY PRIOR empno = mgr;

ENAME                     EMPNO Root empno      LEVEL
-------------------- ---------- ---------- ----------
KING                       7839       7839          1
    JONES                  7566       7839          2
        SCOTT              7788       7839          3
            ADAMS          7876       7839          4
        FORD               7902       7839          3
            SMITH          7369       7839          4
    BLAKE                  7698       7839          2
        ALLEN              7499       7839          3
        MARTIN             7654       7839          3
        TURNER             7844       7839          3
        JAMES              7900       7839          3
    CLARK                  7782       7839          2
        MILLER             7934       7839          3

13行が選択されました。



■CONNECT_BY_ISLEAF
 ・階層構造クエリでROW最下位レベルかどうかを返す。最下位なら1、じゃなければ0

SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
  2         CONNECT_BY_ISLEAF "leaf", level
  3  from emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY NOCYCLE PRIOR empno = mgr;

ENAME                     EMPNO       leaf      LEVEL
-------------------- ---------- ---------- ----------
KING                       7839          0          1
    JONES                  7566          0          2
        SCOTT              7788          0          3
            ADAMS          7876          1          4
        FORD               7902          0          3
            SMITH          7369          1          4
    BLAKE                  7698          0          2
        ALLEN              7499          1          3
        MARTIN             7654          1          3
        TURNER             7844          1          3
        JAMES              7900          1          3
    CLARK                  7782          0          2
        MILLER             7934          1          3

13行が選択されました。



■SYS_CONNECT_BY_PATH
 ・階層構造クエリで現在のROWのPATH情報を簡単に検索できる。

--SQL*Plusできれいに見るために
SQL> COL PATH FORMAT A40

--SYS_CONNECT_BY_PATH例
SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
  2         SYS_CONNECT_BY_PATH(ename, '/') "PATH"
  3    FROM emp
  4   START WITH job='PRESIDENT'
  5  CONNECT BY PRIOR empno=mgr;

ENAME                     EMPNO PATH
-------------------- ---------- ----------------------------------------
KING                       7839 /KING
    JONES                  7566 /KING/JONES
        SCOTT              7788 /KING/JONES/SCOTT
            ADAMS          7876 /KING/JONES/SCOTT/ADAMS
        FORD               7902 /KING/JONES/FORD
            SMITH          7369 /KING/JONES/FORD/SMITH
    BLAKE                  7698 /KING/BLAKE
        ALLEN              7499 /KING/BLAKE/ALLEN
        MARTIN             7654 /KING/BLAKE/MARTIN
        TURNER             7844 /KING/BLAKE/TURNER
        JAMES              7900 /KING/BLAKE/JAMES
    CLARK                  7782 /KING/CLARK
        MILLER             7934 /KING/CLARK/MILLER

13行が選択されました。


 ・下記のようにLeaf Nodeだけ、全体PATH情報が出るように作成できる。

SQL> SELECT LEVEL, SUBSTR(SYS_CONNECT_BY_PATH(ename, ','), 2) path
  2  FROM emp
  3  WHERE CONNECT_BY_ISLEAF = 1
  4  START WITH mgr IS NULL
  5  CONNECT BY PRIOR empno = mgr;

     LEVEL PATH
---------- ----------------------------------------
         4 KING,JONES,SCOTT,ADAMS
         4 KING,JONES,FORD,SMITH
         3 KING,BLAKE,ALLEN
         3 KING,BLAKE,MARTIN
         3 KING,BLAKE,TURNER
         3 KING,BLAKE,JAMES
         3 KING,CLARK,MILLER

7行が選択されました。



■ORDER SIBLINGS BY ・階層構造クエリで相関関係を維持しながら整列させる

SQL> COL ename FORMAT A25
SQL> COL ename2 FORMAT A10

--ORDER SIBLINGS BY例
SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,
  2         ename ename2, empno, level
  3  FROM emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY NOCYCLE PRIOR empno = mgr
  6  ORDER SIBLINGS BY ename2;

ENAME                     ENAME2          EMPNO      LEVEL
------------------------- ---------- ---------- ----------
KING                      KING             7839          1
    BLAKE                 BLAKE            7698          2
        ALLEN             ALLEN            7499          3
        JAMES             JAMES            7900          3
        MARTIN            MARTIN           7654          3
        TURNER            TURNER           7844          3
    CLARK                 CLARK            7782          2
        MILLER            MILLER           7934          3
    JONES                 JONES            7566          2
        FORD              FORD             7902          3
            SMITH         SMITH            7369          4
        SCOTT             SCOTT            7788          3
            ADAMS         ADAMS            7876          4

13行が選択されました。

--きれいに整列された。



--ORDER BY例
SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,
  2         ename ename2, empno, level
  3  FROM emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY NOCYCLE PRIOR empno = mgr
  6  ORDER BY ename2;

ENAME                     ENAME2          EMPNO      LEVEL
------------------------- ---------- ---------- ----------
            ADAMS         ADAMS            7876          4
        ALLEN             ALLEN            7499          3
    BLAKE                 BLAKE            7698          2
    CLARK                 CLARK            7782          2
        FORD              FORD             7902          3
        JAMES             JAMES            7900          3
    JONES                 JONES            7566          2
KING                      KING             7839          1
        MARTIN            MARTIN           7654          3
        MILLER            MILLER           7934          3
        SCOTT             SCOTT            7788          3
            SMITH         SMITH            7369          4
        TURNER            TURNER           7844          3

13行が選択されました。

--変な整列になっている。

0 件のコメント:

コメントを投稿

QLOOKアクセス解析