💻 IT/📌 DataBase
[DB/SQL] 계층형 쿼리 정리 ( START WITH, CONNECT BY PRIOR, ORDER SIBLINGS BY)
GODSU
2024. 8. 13. 13:00
반응형
최근에 회사에서 종속된 관계를 다루는 쿼리를 짜면서..
계층형 쿼리를 짜게 되었는데요~
알아두면 좋을거같아서 정리해보겠습니다!
문법정리
- 계층형 쿼리란? 부모, 자식 간의 수직관계를 트리 구조 형태로 보여주는 쿼리
예제
[테이블 생성]
위에 문법을 적용할 테이블을 준비했습니다. 간단하게 테스트하시는 분은 따라해보시면 좋습니다.
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
마지막 부모의 계층까지 탐색후 종료합니다.
회사에서 자주 사용하는 계층형 쿼리를 간단히 정리해보았습니다.
감사합니다.
반응형