[SQLD] 계층형 쿼리

도지는·2024년 3월 6일

SQLD

목록 보기
6/8

계층형 쿼리

  • 부모, 자식 간의 수직 관계를 트리 구조로 보여주는 쿼리
  • 루트 노드의 LEVEL 값은 1임

START WITH

: 계층 구조 전개의 시작 위치를 지정
시작 행은 여기서 지정됨

CONNECT BY

: 부모, 자식 관계 지정

🖍️ CONNECT BY에 조건절을 사용하는 경우

START WITH절에서 필터링된 데이터는 결과목록에 포함되지만
이후 데이터들은 재귀적으로 모든 하위노드가 제거됨
➡︎ where에 조건절을 사용하면 해당 조건을 만족하지 않는 데이터만 제거되지만 connect by에 사용하면 해당 노드의 하위 노드까지 제거

PRIOR

: PRIOR이 붙은 컬럼이 안붙은 컬럼을 찾아감

  • CONNECT BY PRIOR 자식 컬럼 = 부모 컬럼: 순방향
  • CONNECT BY PRIOR 부모 컬럼 = 자식 컬럼: 역방향

ORDER SIBLINGS

: 형제노드(동일 level) 사이에서 정렬 수행


📝 예제

문제. 정렬 순서상 3번째에 표시될 값은?

TAB1

C1C2C3
1A
21B
31C
42D
SELECT C3
FROM TAB1
START WITH C2 IS NULL
CONNECT BY PRIOR C1 = C2
ORDER SIBLINGS BY C3 DESC

풀이.

  1. C2가 NULL인 행 부터 시작
  2. [이전에 읽은 행의 C1값]이 [C2]인 행 읽기
    ➡︎ 첫번째 행의 C1값인 1이 C2인 행 읽기
    ➡︎ C2가 1인 행. 두번째, 세번째 행 읽기
  3. 반복

C2가 NULL인 행: A
C2가 1인 행: B, C
C2가 2인 행: D

ORDER SIBLINGS BY로 정렬 후:
A C B D

정답.

B


🔗 참고

[오라클, Oracle] 계층 쿼리 (hierarchical query) - 고급 주제
[Oracle]계층형 쿼리 사용법(START WITH, CONNECT BY PRIOR, ORDER SIBLINGS BY)
SQL 자격검정 실전문제, 한국데이터산업진흥원

profile
왕왕

0개의 댓글