DATABASE

[ORACLE] 계층형 쿼리

오래오래 늘 함께 2019. 1. 10. 13:11

 ▶▷계층형 쿼리

 

실행순서

1. START WITH 절

2. CONNECT BY 절 

3. WHERE 절

 

START WITH

: 처음 시작할 조건

  계층의 부모(최상위) 행을 지정

  서브쿼리 사용가능

 

CONNECT BY

: START WITH절의 데이터와 연결된 로우를 반복하여 찾기

  상위와 하위의 관계 지정

  서브쿼리 사용 불가능

 

- PRIOR 컬럼명 : 상위행의 컬럼 의미

- PRIOR 하위(자식)컬럼 = 상위(부모)컬럼 : 상위에서 하위로 트리 구성 (Top Down)

- PRIOR 상위컬럼 = 하위컬럼 : 하위에서 상위로 트리 구성 (Bottoom Up)

- NOCYCLE PRIOR : 무한루프방지(중복막기위해)

 

CONNECT BY절 다음의 AND조건은 순환 관계를 풀면서 AND 조건을 만족하지 않으면, 그 다음레벨은 더 이상 진행하지 않음을 의미함

 

    FROM절 다음의 AND 조건은 순환구조를 모두 전개 한 후에 조건에 해당하는 로우만 추출

 

LEVEL

: 계층의 순서(Depth) 표현

 

ORDER SIBLINGS BY 

: 계층구조의 순서 정렬화 (계층구조는 유지하되 하위구조를 정렬화)

 

 

▷▶계층형 쿼리 예제 1

SELECT 
lec_cd
, alt_lec_cd
, LTRIM ( SYS_CONNECT_BY_PATH (lec_cd, ' > '), ' > ' ) AS depth_fullname
FROM lec030tl
START WITH lec_cd is not null
CONNECT BY NOCYCLE PRIOR lec_cd = alt_lec_cd
 

 SYS_CONNECT_BY_PATH (컬럼명, 구분자)

    : 계층구조의 경로를 보여주는 함수

 

▷▶계층형 쿼리 예제 2

 

select 

      CONNECT_BY_ROOT dept_cd as ROOT_NAME 
from  COM010TL
where LEVEL>=2
and up_cd is not null
and  DEPT_CD = '0434'
and rownum =1 -- ③ LEVEL이 2 이상이고 dept_cd가 0434이고 rownum이 1 (최상위)인 데이터 추출


START with up_cd is not  null
and dept_cd <> '0001' -- ① up_cd가 null이 아니고 dept_cd가 0001이 아닌 데이터로 시작


CONNECT by PRIOR dept_cd=up_cd -- ② up_cd에서 dept_cd로 트리구성