본문 바로가기

IT/DB

[Oracle SQL] 계층형 query 정리

[oracle] 계층형 쿼리 CONNECT_BY


# HIERARCHY 구조

NODE - 하나의 노드는 실 테이블에서 하나의 로우에 해당

PARENT - 부모노드 

CHILD - 자식노드

ROOT - 최상위에 있는 노드

LEAF - 최하위에 있는 노드, 더 이상 하위에 연결된 노드가 없는 노드

LEVEL - 층을 의미

# CONNECT_BY_ROOT는 SATRT_WITH절에 명시된 ROOT노드를 가지고 옴

# CONNECT_BY_ISCYCLE - A가 B의 자식노드임과 동시에 B가 A의 자식노드인 중복 참조를 하는 항목을 판별 

# CONNECT_BY_ISLEAF - 해당 ROW가 LEAF인지 여부츨 체크, LEAF는 1, 아닐 경우는 0

# CONNECT_BY_ISLEAF 사용에 예

-- INDEX_CODE는 코드명 HI_INDEX_CODE는 상위 코드 

SELECT

INDEX_CODE

,INDEX_NAME

,LEVEL -- 층을 의미

,SYS_CONNECT_BY_PATH(TRIM(INDEX_NAME), '>') AS PATH -- 연결구조를 보여줌

,SYS_CONNECT_BY_PATH(TRIM(INDEX_CODE), '>') AS CODE_PATH

FROM 테이블명

WHERE CONNECT_BY_ISLEAF = 0 -- 마지막 잎만 보여줄 경우 1, 아닐경우 0

START WITH HI_INDEX_CODE IS NULL -- 시작점 지정

CONNECT BY PRIOR INDEX_CODE = HI_INDEX_CODE 

# CONNECT_BY_ROOT 사용 예제

SELECT

INDEX_CODE

,INDEX_NAME

,LEVEL

,SYS_CONNECT_BY_PATH(TRIM(INDEX_NAME), '>') AS PATH -- 연결구조를 보여줌

,SYS_CONNECT_BY_PATH(TRIM(INDEX_CODE), '>') AS CODE_PATH

,CONNECT_BY_ROOT INDEX_NAME AS ROOT_NAME

FROM LS_ST_INDEX

WHERE CONNECT_BY_ISLEAF = 0

START WITH HI_INDEX_CODE IS NULL -- 시작점 지정

CONNECT BY PRIOR INDEX_CODE = HI_INDEX_CODE