본문 바로가기

DB/오라클

계층형 쿼리



# 오라클 계층 쿼리 


# 서론
Q : 계층구조 테이블 조회를 어떻게 해야하나?
A : SQL기본문법으로 절대 해결할 수 없다.
     그러나 오라클에는 계층구조 전용 SQL 구문이 있다. 

# 계층구조테이블 구성
     부모와 자식의 계층 관계를 구조화한 테이블로서 코드(하위코드)부모코드(상위코드)로 구성됨!

1번그림 : 데이터 모델관점(논리적관점)에서의 구조
2번그림 : 트리구조형태(논리적관점)에서의 구조
3번그림 : RDB(관계형DB)에서의 계층구조 


# 오라클의 계층구조 쿼리 기본 문법
SELECT 컬럼리스트
     , LEVEL AS 계층의깊이
     , CONNECT_BY_ROOT REF_SEQ AS 루트노드값
     , CONNECT_BY_ISLEAF  AS 최하위여부최하위1
     , SYS_CONNECT_BY_PATH(REPLY_SEQ, '-') AS 계층구조전체경로
FROM 테이블
WHERE (조건)
START WIEH (시작 위치 조건)
CONNECT BY (PRIOR 하위코드 = 상위코드)
ORDER SIBLINGS BY (정렬기준)
SELECT BOARD_SEQ
     , REF_SEQ
     , REPLY_SEQ
     , REPLY_LEVEL
     , TITLE
FROM NEWBOARD
START WITH REPLY_SEQ = 0
CONNECT BY PRIOR BOARD_SEQ = REPLY_SEQ
ORDER SIBLINGS BY REF_SEQ DESC, BOARD_SEQ ASC     // 정렬은 그룹번호로

1) START WITH : 계층구조의 시작 조건을 기술
2) CONNECT BY : 계층구조의 전개 조건을 기술
3) PRIOR : 컬럼앞에 붙어 상위행의 컬럼임을 나타냄
4) LEVEL : 계층구조 전개의 깊이/단계를 포현
5) ORDER SIBLINGS BY : 같은 부모 아래 형제들끼리 정렬 

6) CONNECT_BY_ROOT (컬럼) : 계층의 최상위 값을 표시
7) CONNECT_BY_ISLEAF : 계층의 최하위 여부를 표시( 최하위면 1 )
8) SYS_CONNECT_BY_PATH : 계층전체경로 표시 


6,7,8은 옵션이고 핵심만 정리하자면
START WITH에 시작ROW에 대한 조건을
CONNECT BY PRIOR 뒤에 시작ROW의 자식코드(하위코드) = 연결될 부모코드(상위코드)















'DB > 오라클' 카테고리의 다른 글

오라클 서브쿼리 ( subquery )  (0) 2019.04.03
오라클 함수  (0) 2019.04.03
오라클 기초  (0) 2019.04.03
오라클 DDL, DML, DCL, TCL (제약조건 포함)  (0) 2019.04.03
SQL시스템과 오라클 SQL PLUS  (0) 2019.04.03