계층형 질의란?
동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 의미
테이블에 존재하는 계층형 데이터를 조회하기 위해 계층형 질의 사용
- 부모 자식 간의 수직 관계를 트리 구조 형태로 보여주는 쿼리이다.
- 루트 노드의 Level 값은 1이다. (0이 아님에 주의!)
- 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 의 경우는 계층형 질의에서 사용되는 가상 컬럼이다.
- Level : 루트 데이터는 1부터 하위는 +1씩 증가함
- Connect_by_Isleaf : 전개과정에서 해당 데이터가 리프 데이터면 1 아니면 0
- 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 |