반응형
최근에 회사에서 종속된 관계를 다루는 쿼리를 짜면서..
계층형 쿼리를 짜게 되었는데요~
알아두면 좋을거같아서 정리해보겠습니다!
문법정리
- 계층형 쿼리란? 부모, 자식 간의 수직관계를 트리 구조 형태로 보여주는 쿼리
예제
[테이블 생성]
위에 문법을 적용할 테이블을 준비했습니다. 간단하게 테스트하시는 분은 따라해보시면 좋습니다.
CREATE TABLE DPT (
HI_DPT_CD VARCHAR2(20), --상위부서
LO_DPT_CD VARCHAR2(20), --하위부서
SEQ number(3) --부서이력
STDT VARCHAR2(8) --시작일시
);
어디 조직이든 한번씩은 있는 부서 테이블 입니다.
[테스트 데이터 입력]
/*
ITHQ : IT본부
ITDV : IT개발팀
ITDVS : IT개발셀
*/
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT) VALUES ('ITHQ01','ITDV01', 1, '20240101')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITHQ01','ITDV02', 1, '20240201')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITHQ01','ITDV03', 1, '20240301')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV01','ITDVS11', 1, '20240102')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV01','ITDVS12', 1, '20240103')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV01','ITDVS13', 1, '20240104')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV02','ITDVS21', 1, '20240202')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV02','ITDVS22', 1, '20240203')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV02','ITDVS23', 1, '20240204')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV03','ITDVS31', 1, '20240302')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV03','ITDVS32', 1, '20240303')
INSERT INTO DPT (HI_DPT_CD, LO_DPT_CD, SEQ, STDT ) VALUES ('ITDV03','ITDVS33', 1, '20240304')
IT회사에 각 부서정보를 임시로 넣어보았습니다.
[부모에서 자식으로 순방향 계층쿼리]
SELECT
DPT.HI_DPT_CD
,DPT.LO_DPT_CD
,STDT
,LEVEL
FROM DPT
START WITH HI_DPT_CD = 'ITHQ01'
CONNECT BY PRIOR LO_DPT_CD = HI_DPT_CD
실행 결과를 보면 최상위 부모행('ITHQ01')에서 자식이 없을 때까지 탐색하는 것을 확인할 수 있습니다.
[부모에서 자식으로 순방향 계층쿼리+조건절]
SELECT
DPT.HI_DPT_CD
,DPT.LO_DPT_CD
,STDT
,LEVEL
FROM DPT
START WITH HI_DPT_CD = 'ITHQ01'
CONNECT BY PRIOR LO_DPT_CD = HI_DPT_CD
AND HI_DPT_CD = 'ITHQ01'
조건절도 넣을 수 있는데요, 조건으로 상위('ITHQ01')를 넣으면 조건에 맞는 것만 조회가능합니다.
[부모에서 자식으로 순방향 계층쿼리+정렬]
SELECT
DPT.HI_DPT_CD
,DPT.LO_DPT_CD
,STDT
,LEVEL
FROM DPT
START WITH HI_DPT_CD = 'ITHQ01'
CONNECT BY PRIOR LO_DPT_CD = HI_DPT_CD
ORDER SIBLINGS BY STDT DESC
결과를 확인해보면, ORDER SIBLINGS BY로 STDT(시작일시)에 따른 정렬된 결과를 볼수 있습니다.
[자식에서 부모으로 역방향 계층쿼리]
SELECT
DPT.HI_DPT_CD
,DPT.LO_DPT_CD
, STDT
, LEVEL
FROM DPT
START WITH LO_DPT_CD = 'ITDVS13'
CONNECT BY LO_DPT_CD = PRIOR HI_DPT_CD
마지막 부모의 계층까지 탐색후 종료합니다.
회사에서 자주 사용하는 계층형 쿼리를 간단히 정리해보았습니다.
감사합니다.
반응형
'💻 IT > 📌 DataBase' 카테고리의 다른 글
[DB/SQL] 오라클 PARTITION BY 정리 | 집계함수 사용 | 순위함수 사용 (6) | 2024.08.28 |
---|---|
[DB/SQL] 데이터베이스 한글 바이트 확인 | ORACLE 한글 | 한글 Byte | DB 한글 확인 | DB 한글 몇바이트 | 오라클 한글 바이트 (0) | 2024.08.14 |
[DB/ORACLE] 오라클 데이터베이스 버전 확인 방법 (0) | 2024.08.12 |
[DB/ORACLE] 오라클 데이터베이스 테이블 조회하는 방법 (0) | 2024.08.11 |
[DB] ORACLE DataBase 비밀번호 재설정 (초기화방법) 초간단 방법 (1) | 2024.08.10 |