[SQLD] 계층형 질의 (계층쿼리-Hierarchical Query)

yjkim97·2023년 8월 30일

자격증

목록 보기
17/24
post-thumbnail

SQL 예시

SELECT
	LEVEL, -- 뎁스 : 루트노드인 경우 1
	SYS_CONNECT_BY_PATH(컬럼, 구분자), -- 경로 출력
    CONNECT_BY_ROOT 컬럼, -- 루트노드의 컬럼
    CONNECT_BY_ISLEAF,  -- 최하위노드인 경우 1, 그외는 0
    ...
FROM 테이블
START WITH 부모컬럼 IS NULL -- 경로가 시작되는 루트노드 설정
CONNECT BY PRIOR 컬럼 = 부모컬럼 -- CONNECT BY : 계층 경로 설정 (부모, 자식 관계) / PRIOR : 바로 앞에 있는 부모노드 반환
...
ORDER SIBLINGS BY 컬럼 -- 같은 계층내에서 정렬
;

SQL 문법 설명

LEVEL

  • 현재 노드 레벨
  • Root노드인 경우 1

SYS_CONNECT_BY_PATH(컬럼, 구분자)

  • 해당 컬럼을 기준으로 현재 노드의 계층 경로 생성

CONNECT_BY_ROOT 컬럼

  • Root노드의 해당 컬럼을 반환

CONNECT_BY_ISLEAF

  • 현재 노드의 최하위 노드 여부 반환
  • 최하위 노드인 경우 : 1
  • 그외 : 0

CONNECT BY절

  • 계층 관계를 설정 (부모노드, 자식노드의 관계)

⭐️ CONNECT BY절에 작성된 조건절
START WITH절에서 필터링된 시작 데이터는 결과목록에 포함되어지며, 이후 CONNECT BY절에 의해 필터링 된다.

계층형 질의문에서 Where절
모든 전개를 진행한 이후 필터 조건으로써 조건을 만족하는 데이터만을 추출하는데 활용된다.

PRIOR

  • CONNECT BY절에서 사용
  • 이전 행의 해당 컬럼 값을 가져옴
  • ⭐️ PRIOR 자식 = 부모 : 순방향 전개
  • ⭐️ PRIOR 부모 = 자식 : 역방향 전개

⭐️ Oracle은 PRIOR 키워드 SELECT, WHERE절에서도 사용 가능

ORDER SIBLINGS BY

  • 형제 노드 (같은 레벨 노드)끼리 정렬
profile
어제는 🐸두꺼비 오늘은 😄YJ

0개의 댓글