계층형 구조 생성
지인이 게시판의 코멘트 기능을 만드는데 코멘트의 댓코멘트를 추가로 달 수 있는 구조라 하면서
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 이 아니라고 함(오라클 버그?)