본문 바로가기

sqld

2-14) 계층형 질의

계층형 질의
  • 하나의 테이블 내 각 행끼리 관계를 가질 때, 연결고리를 통해 행과 행 사이의 계층 (depth)을 표현하는 기법
    • 예) DEPT2에서의 부서별 상하관계
  • PRIOR의 위치에 따라 연결하는 데이터가 달라짐

 

** 문법

  • START WITH : 데이터를 출력할 시작 지정하는 조건
  • CONNECT BY PRIOR : 행을 이어나갈 조건
  • NOCYCLE : 순환이 발생하면 무한 루프가 될 수 있기 때문에 이를 방지하고자 사용

 

예1) DEPT2 테이블에 대해 각 부서의 레벨을 출력 (최상위 부서가 1 레벨)

 

잘못된 예) PRIOR 잘못 지정 시 아무것도 출력되지 않음!

 

예2) 계층형 질의 조건 전달

 

CASE1) CONNECT BY 절에 전달 : 연결 조건이 추가되었으므로 모든 조건이 만족할 경우만 하위 레벨로 연결됨

 

CASE2) WHERE 절에 전달 : 모든 출력 결과 중 '서울지사' 데이터만 출력됨

- 이미 하위레벨을 다 정한 뒤에 데이터 필터링

  • CONNECT BY에 전달했을 때는 연결 조건이므로 ROOT 행이 출력되지만, WHERE 절에 전달한 경우 '서울지사'인 것만 출력
    • ROOT행이 '서울지사'가 아니라면 출력 X

 

계층형 질의 가상 컬럼
  1. LEVEL : 각 DEPTH를 표현 (시작점부터 1)
  2. CONNECT_BY_ISLEAF : LEAF NODE (최하위노드) 여부 (참 : 1, 거짓 : 0)

 

계층형 질의 가상 함수
  1. CONNECT_BY_ROOT 컬럼명 : 루트노드의 해당하는 컬럼 값
  2. SYS_CONNECT_BY_PATH(컬럼, 구분자) : 이어지는 경로 출력
  3. ORDER SIBLINGS BY 컬럼 : 같은 LEVEL의 경우 정렬 수행
  4. CONNECT_BY_ISCYCLE : 계층형 쿼리의 결과에서 순환이 발생했는지 여부

 

예1) 계층형 질의절 가상 컬럼 및 함수의 사용

 

예2) NOCYCLE 옵션

<EMPLOYEES DATA>

 

NOCYCLE 옵션 없이 - ERROR 발생)

  • 1000번 직원의 매니저는 2000번 직원, 2000번 직원의 매니저는 1000번 직원 → 사이클 발생

 

NOCYCLE 옵션 수행)

  • 정상 출력됨

 

 

 

 

 

'sqld' 카테고리의 다른 글

2-16) 정규 표현식  (0) 2024.08.22
2-15) PIVOT과 UNPIVOT  (0) 2024.08.22
2-13) TOP N QUERY  (0) 2024.08.22
2-12) 윈도우 함수  (0) 2024.08.22
2-11) 그룹 함수  (0) 2024.08.21