본문 바로가기

프로그램/oracle

[ORACLE]CONNECT BY 를 이용하여 계층구조 만들기

반응형

계층형 구조 생성


지인이 게시판의 코멘트 기능을 만드는데 코멘트의 댓코멘트를 추가로 달 수 있는 구조라 하면서

CONNECT BY 를 사용하여 계층을 만들어달라고 해서 작업해보았다.


일단 샘플로 돌릴 데이터를 다음과 같이 만들어 WITH 로 사용하였다.

    SELECT 3 AS IDX, 0 AS SLEVEL, NULL AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 4 AS IDX, 1 AS SLEVEL, 3 AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 5 AS IDX, 1 AS SLEVEL, 3 AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 6 AS IDX, 1 AS SLEVEL, 3 AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 7 AS IDX, 2 AS SLEVEL, 5 AS NNO 

    FROM DUAL


컬럼 설명

IDX : 기본 키

SLEVEL : 글의 LEVEL

NNO : 원코멘트의 IDX


쿼리는 다음과 같다.

WITH CMT AS (

    SELECT 3 AS IDX, 0 AS SLEVEL, NULL AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 4 AS IDX, 1 AS SLEVEL, 3 AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 5 AS IDX, 1 AS SLEVEL, 3 AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 6 AS IDX, 1 AS SLEVEL, 3 AS NNO 

    FROM DUAL

    UNION ALL

    SELECT 7 AS IDX, 2 AS SLEVEL, 5 AS NNO 

    FROM DUAL

)

SELECT * 

FROM CMT 

CONNECT BY PRIOR IDX = NNO

START WITH NNO IS NULL

ORDER SIBLINGS BY IDX DESC



CONNECT BY PRIOR 에서 계층형으로 만들 조건 입력


START WITH 에서 어느 것 부터 계층 검사를 시작할 것인지 입력


ORDER SIBLINGS BY 를 통해 계층구조를 꺠지 않고 어떻게 ORDER BY 할 것인지 입력



실행순서

1. START WITH 

2. CONNECT BY PRIOR

- PRIOR 쪽 컬럼이 상수로 제공됨

3. WHERE 조건



where : check 조건

connect by prior : join 조건

start with : driving 조건


connect by prior 에 and 조건 가능해보임


prior 을 select 절에서 사용할 수도 있다.


select lot_id, prior lot_id as p_lot_id

from 생산트랜잭션

connect by prior lot_id = p_lot_id

start with p_lot_id = 'AA'


connect by prior 조건 뒤에 and 로 일반 조건을 넣으면 될 것 같음



실행계획에서 Access Full 나는 문제

- 버젼 : 10.0.3.2 였던 것 같음-_-;

- 참고 url 

- http://www.dator.co.kr/know_site/64303

- 실제로는 ACCESS FULL 이 아니라고 함(오라클 버그?)