[Oracle] 계층형 쿼리카테고리 없음2024. 3. 7. 15:34
Table of Contents
계층형 모델
인스턴스에서 다른 인스턴스의 속성 값을 통해 상위와 하위를 구분할 수 있는 테이블
예시
직원 아이디 | 이름 | 상사 아이디 |
1001 | 김철수 | null |
1002 | 신짱구 | 1001 |
상사의 아이디를 통해 '짱구'의 상사가 '철수'임을 알 수 있다.
계층형 쿼리
계층형 모델에서 계층을 통해 데이터를 가공해서 조회하기 위한 쿼리
예시
SELECT D.*, LEVEL
FROM DEPT2 D
START WITH PDEPT IS NULL
CONNECT BY PRIOR DCODE = PDEPT;
쿼리 결과
DCODE | DNAME | PDEPT | AREA | LEVEL | |
1 | 0001 | 사장실 | null | 포항본사 | 1 |
2 | 1000 | 경영지원 | 0001 | 서울지사 | 2 |
3 | 1001 | 재무관리 | 1000 | 서울지사 | 3 |
4 | 1002 | 총무팀 | 1000 | 서울지사 | 3 |
5 | 1003 | 기술부 | 0001 | 포항본사 | 2 |
6 | 1004 | H/W 지원 | 1003 | 대전지사 | 3 |
7 | 1005 | S/W 지원 | 1003 | 경기지사 | 3 |
START WITH
인스턴스의 시작점을 지정하며, 서브 쿼리 사용이 가능하다.
- 위 예시에서는 PDEPT가 null인 사장실이 계층의 최상위인 루트가 된다.
CONNECT BY PRIOR
최상위부터 이어지는 값의 조건을 설정하며, PRIOR를 통해 검사할 컬럼의 우선 순위를 정할 수 있다.
주의 사항은 PRIOR를 어느 쪽에 지정하는지에 따라 결과가 다르게 나온다.
서브 쿼리 사용은 불가능하다.
실행 과정
- 위 예시에서는 DCODE가 PDEPT와 같은 값을 가져온다.
- 이때 DCODE 기준으로 잡았기 때문에 DCODE 0001이 PDEPT인 인스턴스를 찾는다.
- 2번과 5번 행을 가져올 수 있다.
- PDEPT가 1000, 1003인 값을 가져온다.
- 3~4번 과정을 반복하여 계층적으로 값을 조회한다.
PRIOR을 PDEPT에 걸었다면?
사장실의 PDEPT는 null이다. 따라서 DCODE가 null인 값을 찾게되며, DCODE가 null인 값은 없기 때문에 사장실 인스턴스 하나만 출력된다.
즉, PRIOR가 붙은 쪽에서 안붙은 쪽으로 찾는다.
@뽀글뽀글 개발자 :: 뽀글뽀글 개발 일지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!