계층적 쿼리#

SQL> select lpad(' '(level-1)*2' ')||ename ename
  2  from emp
  3  start with ename='KING'
  4  connect by mgr=prior empno;

ENAME
--------------------------------------------------------------------------------
KING
  JONES
    SCOTT
      ADAMS
    FORD
      SMITH
  BLAKE
    ALLEN
    WARD
    MARTIN
    TURNER

ENAME
--------------------------------------------------------------------------------
    JAMES
  CLARK
    MILLER

14 개의 행이 선택되었습니다.
  1. start with 조건문 - 시작위치를 지정
  2. connect by prior - 각 행의 연결고리 역할. prior은 상위행을 지정한다.
  3. order by siblings by 칼럼명 - 일반적으로 정렬을 위해 order by를 사용하지만 계층적 쿼리에 사용하면 계층구조가 깨지는 상황이 발생한다. 그래서 레벨별로 정렬작업을 하고자 할때는 이 구문을 추가한다.
  4. sys_connect_by_path() - 계층쿼리를 사용할때 계층별 전체 경로를 가져오고자 할때 사용한다.
  5. 계층적 쿼리의 조인 - 9i이후부터는 계층적 쿼리에 조인이 가능하게 되었다.

분석함수#

등급 매기기와 N번째까지 찾아내기

SQL> select rownum,
  2  rank() over (order by hiredate"RANK",
  3  dense_rank() over (order by hiredate"DENSE_RANK",
  4  rank() over (partition by to_char(hiredate, 'yy') order by hiredate"PARTITIONED_RANK",
  5  ename, hiredate
  6  from emp
  7  order by hiredate;

    ROWNUM       RANK DENSE_RANK PARTITIONED_RANK ENAME      HIREDATE
---------- ---------- ---------- ---------------- ---------- --------
         1          1          1                1 SMITH      80/12/17
         2          2          2                1 ALLEN      81/02/20
         3          3          3                2 WARD       81/02/22
         4          4          4                3 JONES      81/04/02
         6          5          5                4 BLAKE      81/05/01
         7          6          6                5 CLARK      81/06/09
        10          7          7                6 TURNER     81/09/08
         5          8          8                7 MARTIN     81/09/28
         9          9          9                8 KING       81/11/17
        12         10         10                9 JAMES      81/12/03
        13         10         10                9 FORD       81/12/03

    ROWNUM       RANK DENSE_RANK PARTITIONED_RANK ENAME      HIREDATE
---------- ---------- ---------- ---------------- ---------- --------
        14         12         11                1 MILLER     82/01/23
         8         13         12                1 SCOTT      87/04/19
        11         14         13                2 ADAMS      87/05/23

14 개의 행이 선택되었습니다.

RANK 값은 일종의 순위값이다. 여기서는 입사일(hiredate)을 기준으로 한다. 단 DENSE_RANK값과의 차이점은 같은 순위가 두개 이상일때 그 갯수만큼 증가된 값을 순위가 매겨지는 것이고 DENSE_RANK는 그 수에 관계없이 순차적으로 순위를 매기는 것이다. PARTITIONED_RANK는 연도를 기준으로 순위를 매긴것이다.

merge#

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-1) was last changed on 12-Jan-2008 18:28 by DongGukLee