SQL

SQL / 계층형 구조 쿼리 (Hierarchical Queries)

너무앵 2022. 1. 14. 06:52

 

 

 계층형 구조란?

- 상위 행과 하위 행의 데이터를 트리 형태로 상향식 혹은 하향식으로 조회 할 수 있게 배치함.

EMPNO   ENAME    SAL    MGR
------ ------- ------ ------
  1100  정승명     800   1000
  1000  최대호     3000   2000

정승명(empno 1100)은 최대호(empco 1000)을 상사로 두고있는 사원이며 정승명-최대호 사이는 수직적 관계다.

 

계층형 조회란?

CONNECT BY는 트리형태의 구조로 질의를 수행한다.

 

CONNECT BY 구문의 실행 순서는 다음과 같다.

 1. START WITH

    - 계층 구조에서 처음으로 탐색을 실행하는 행(부모행, Root행)을 설정한다 / 시작조건 설정

    - 서브쿼리를 사용할 수 있다.

 2. CONNECT BY

    - 상위 행 <-> 하위 행의 관계를 정의한다

    - CONNECT BY PRIOR로 사용한다.

  • - CONNECT BY PRIOR 자식컬럼 = 부모컬럼 : 부모에서 자식으로 트리구성 (Top Down)
  • - CONNECT BY PRIOR 부모컬럼 = 자식컬럼 : 자식에서 부모로 트리 구성 (Bottom Up)

    - ex) CONNECT BY PRIOR empno(상위) = mgr;(하위)

          시작 행의 empno가 하위 행의 mgr인 데이터를 조회

 3. WHERE

    - 가장 마지막에 조회된다.

    - START WITH부터 전체값을 조회한 뒤 WHERE절에서 최종 값을 골라내야함

 

 

 

계층형 구조 예시 구문

SELECT LEVEL, LPAD(' ',4*(LEVEL-1) || ename ename, empno, mgr
FROM emp
WHERE ename <> '이유혁'
START WITH mgr = null
CONNECT BY PRIOR empno = mgr;

   1) mgr이 null(상사가 없는 - 즉 대빵)인 행부터 조회를 시작한다 (START WITH)

   2) 시작행(상위 행)의 empno를 자신의 mgr로 가지고 있는 하위행을 조회한다(CONNECT BY PRIOR)

   3) ename이 '이유혁'인 행은 제외한다.(WHERE)