[Oracle] 계층형 쿼리

계층형 모델

인스턴스에서 다른 인스턴스의 속성 값을 통해 상위와 하위를 구분할 수 있는 테이블

 

예시

직원 아이디 이름 상사 아이디
1001 김철수 null
1002 신짱구 1001

 

상사의 아이디를 통해 '짱구'의 상사가 '철수'임을 알 수 있다.

 

 

계층형 쿼리

계층형 모델에서 계층을 통해 데이터를 가공해서 조회하기 위한 쿼리

 

예시

SELECT D.*, LEVEL
FROM DEPT2 D
START WITH PDEPT IS NULL
CONNECT BY PRIOR DCODE = PDEPT;

쿼리 결과

  DCODE DNAME PDEPT AREA LEVEL
1 0001 사장실 null 포항본사 1
2 1000 경영지원 0001 서울지사 2
3 1001 재무관리 1000 서울지사 3
4 1002 총무팀 1000 서울지사 3
5 1003 기술부 0001 포항본사 2
6 1004 H/W 지원 1003 대전지사 3
7 1005 S/W 지원 1003 경기지사 3

 

 

START WITH

인스턴스의 시작점을 지정하며, 서브 쿼리 사용이 가능하다.

  • 위 예시에서는 PDEPT가 null인 사장실이 계층의 최상위인 루트가 된다. 

 

CONNECT BY PRIOR

최상위부터 이어지는 값의 조건을 설정하며, PRIOR를 통해 검사할 컬럼의 우선 순위를 정할 수 있다.

주의 사항은 PRIOR를 어느 쪽에 지정하는지에 따라 결과가 다르게 나온다.

서브 쿼리 사용은 불가능하다.

 

실행 과정

  1. 위 예시에서는 DCODE가 PDEPT와 같은 값을 가져온다.
  2. 이때 DCODE 기준으로 잡았기 때문에 DCODE 0001이 PDEPT인 인스턴스를 찾는다.
  3. 2번과 5번 행을 가져올 수 있다.
  4. PDEPT가 1000, 1003인 값을 가져온다.
  5. 3~4번  과정을 반복하여 계층적으로 값을 조회한다.

 

PRIOR을 PDEPT에 걸었다면?

사장실의 PDEPT는 null이다. 따라서 DCODE가 null인 값을 찾게되며, DCODE가 null인 값은 없기 때문에 사장실 인스턴스 하나만 출력된다.

즉, PRIOR가 붙은 쪽에서 안붙은 쪽으로 찾는다.

'데이터베이스 > Oracle' 카테고리의 다른 글

[Oracle] docker oracle 설치  (0) 2023.07.11
[Oracle] Trigger 연습  (0) 2023.04.13
[Oracle] 서브 쿼리  (0) 2023.04.07
[Oracle] JOIN  (0) 2023.04.07
Oracle 설치 및 SCOTT 계정 활성화  (0) 2023.04.06