SQL

[오라클] START WITH 와 CONNECT BY

우혁이 아빠 2010. 10. 9. 10:47

START WITH 와 CONNECT BY 를 이용하여  데이터를 계층 구조로 조회할 수 있다.

예1)

  SELECT LEVEL, EMPNO, ENAME, MGR
  FROM EMP

  START WITH JOB = 'PRESIDENT'
  CONNECT BY PRIOR EMPNO = MGR;

 

==> 직업이 PRESIDENT를 기준으로 사원과 관리자의 관계를 계층 구조로 조회

 

예2)

 SELECT LPAD( ' ', 4*(LEVEL-1) ) || ENAME, EMPNO, MGR, JOB

 FROM EMP

 START WITH JOB = 'PRESIDENT'

 CONNECT BY PRIOR EMPNO = MGR;

 

==> 예1의 결과를 ㅏ지고 LPAD 함수를 이용하여 ENAME 왼쪽에 공백을 추가

 

예3)

 SELECT LPAD( ' ', 4*(LEVEL-1) ) || ENAME, EMPNO, MGR, JOB

 FROM EMP

 START WITH JOB = 'PRESIDENT'

 CONNECT BY PRIOR EMPNO = MGR

 AND LEVEL <= 2;

 

==> LEVEL 2까지만 조회

 

예4)

 SELECT LEVEL, SUM(SAL), COUNT(EMPNO)

 FROM EMP

 START WITH JOB = 'PRESIDENT'

 CONNECT BY PRIOR EMPNO = MGR

 GROUP BY LEVEL;

 

==> LEVEL 별로 급여의 합과 인원수를 조회

 

※ START WITH : 계층 질의에서 루트(부모행)로 사용될 행을 지정한다.

    CONNECT BY : 계층 질의에서 상위계층(부모행)과 하위계층(자식행)의 관계를 지정한다.

 

※ 실행순서

     1. START WITH 절

     2. CONNECT BY 절

     3. WHERE 절

 

※ 데이터가 많아 질 경우....

    1. START WITH JOB = 'PRESIDENT' 의 JOB 칼럼에 INDEX가 없으면 속도를 보장할 수 없다.

    2. CONNECT BY PRIOR EMPNO = MGR 의 PRIOR 쪽의 컬럼값이 상수가 되기 때문에 MGR칼럼에 INDEX를 생성해야 CONNECT BY 의 속도를 보장할 수 있다.

 -- 덕분에 필요하던 것이 한번에 해결되었습니다.