본문 바로가기
Web Study/DataBase

SQLD - 계층형 질의

by 쿠리의일상 2023. 10. 29.

계층형 질의란?

동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 의미
테이블에 존재하는 계층형 데이터를 조회하기 위해 계층형 질의 사용
  1. 부모 자식 간의 수직 관계를 트리 구조 형태로 보여주는 쿼리이다.
  2. 루트 노드의 Level 값은 1이다. (0이 아님에 주의!)
  3. Oracle 에서만 가능

 


  • Start with : 계층 구조 전개의 시작 위치를 지정하는 구문, 루트 데이터 지정
    • 시작 데이터는 결과 목록에 포함되어진다!
  • Connect by : 다음에 전개될 자식 데이터를 지정하는 구문
    • 자식 데이터는 Connect by 절에 주어진 조건을 만족해야 한다.
  • Prior : Connect by 절에 사용되며, 현재 읽은 칼럼을 지정
    • Prior 자식 = 부모 이면 부모 -> 자식 방향으로 순방향 전개 == Connect by 부모 = Prior 자식
    • Prior 부모 = 자식 이면 자식 -> 부모 방향으로 역방향 전개 == Connect by 자식 = Prior 부모
Start with -> Connect by -> Prior 순으로 수행
  • Nocycle : 이미 나타났던 동일한 데이터가 전개 중에 다시 나타나면 오류가 발생하는데, Nocycle 을 추가하면 오류를 발생시키지 않고 사이클이 발생한 이후 데이터를 전개하지 않음

  • Order siblings by : 형제 노드 사이에서 정렬을 수행

 


Select A.부서코드, A.부서명, A.상위부서코드, B.매출액, LVL
From (Select 부서코드, 부서명, 상위부서코드, Level As LVL
	From 부서
        Start with 부서코드 = '120'
        Connect by prior 상위부서코드 = 부서코드
        Union
      Select 부서코드, 부서명, 상위부서코드, Level As LVL
      	From 부서
        Start with 부서코드 = '120'
        Connect by 상위부서코드 = prior 부서코드) A Left Outer Join 매출 B
On (A.부서코드 = B.부서코드)
Order by A.부서코드;

위의 쿼리문에서 첫번째 서브쿼리문은 부서코드 120인 튜플을 루트 데이터로 Connect by의 부서코드 -> 상위부서코드의 순방향 정보를 가리킨다. 두번째 서브쿼리문은 부서코드 120인 튜플을 루트 데이터로 Connect by 의 상위부서코드 -> 부서코드 순의 역방향 정보를 가리키게 된다.

 

Level 의 경우는 계층형 질의에서 사용되는 가상 컬럼이다.

  1. Level : 루트 데이터는 1부터 하위는 +1씩 증가함
  2. Connect_by_Isleaf : 전개과정에서 해당 데이터가 리프 데이터면 1 아니면 0
  3. Connect_by_Iscycle : 전개과정에서 자식을 갖는데 해당 데이터가 조상으로써 존재하면 1 아니면 0

'Web Study > DataBase' 카테고리의 다른 글

SQLD 그룹함수  (1) 2023.11.20
SQLD - 서브쿼리  (1) 2023.10.31
SQLD - 함수 - 단일행 함수  (0) 2023.09.13
SQLD - Join 에 대해  (0) 2023.09.10
SQLD - Transaction (트랜잭션)  (0) 2023.09.07