-- 정전개
SELECT
CONNECT_BY_ROOT PGM_ID "root"
, LEVEL
, LPAD(' ', 4*(LEVEL-1)) || PGM_ID AS PGM_ID
, PGM_NM, UP_PGM_ID
, SYS_CONNECT_BY_PATH (PGM_NM, '=>') AS full_name // Path
, CONNECT_BY_ISLEAF "leaf" // 최하위 레벨 여부
From TS_PROG2
WHERE USE_YN = 'Y'
START WITH PGM_id = 'root'
CONNECT BY PRIOR PGM_ID = UP_PGM_ID
ORDER SIBLINGS BY PGM_NM
-- 역전개
SELECT LEVEL
, LPAD(' ', 4*(LEVEL-1)) || PGM_ID AS PGM_ID
, PGM_NM, UP_PGM_ID
, SYS_CONNECT_BY_PATH (PGM_NM, '=>') AS full_name
From TS_PROG2
WHERE USE_YN = 'Y'
START WITH PGM_id = '1000015'
CONNECT BY PGM_ID = PRIOR UP_PGM_ID
ORDER SIBLINGS BY PGM_NM
SELECT
FROM
WHERE
START WITH
CONNECT BY PRIOR
ORDER SIBLINGS BY
◈ 이용
1) 쇼핑목 카테고리 관계 - 대분류, 중분류, 소분류 등을 트리 구조로
2) 게시판 에서 일반글 과 답글과의 관계 등을 트리 구조로
◈ 데이터가 많아질 경우....
- 첫째로 풀리는 START WITH job='PRESIDENT' job 컬럼에 index가 생성되어 있지 않는다면
속도를 보장할 수 없습니다.
- 그리고 둘째로 풀리는 CONNECT BY PRIOR empno = mgr 역시 PRIOR 쪽의 컬럼값이 상수가
되기 때문에 MGR컬럼에 index를 생성하여야 CONNECT BY의 속도를 보장할 수 있습니다.
- 계층구조를 CONNECT BY, START WITH로 풀면 부분범위 처리가 불가능하고 Desc으로
표현하기가 어렵 습니다.
--------------- 설명
-- 아래 예제 1
1) job 이 president 인 row 을 가져온다.
2) 가져온 row 에서 prior 이 붙은 comumn 의 데이타를 가져온다. 여긴선 empno 다.
3) PRIOR empno = mgr empno 을 mgr 로 사용하는 row 을 가져온다. 기존의 row 상위, 비교해서 가져온 row 하위에 있게 된다.
4) 이제 두번째로 가져온 row 에서 PRIOR empno = mgr 을 실행시킨다.
5) 이런 과정이 연속으로 반복되면서 최종적으로 가져온 data 는 트리 구조를 이루게 된다.(계층구조)
6) LEVEL 은 depth 을 의미한다.
힌트 사용 방법 (0) | 2012.05.21 |
---|---|
숫자를 한글로 표기하는 Function (0) | 2012.05.21 |
테이블 함수 예제 2 (0) | 2012.05.18 |
문자열 수식을 입력받아 계산된 값 리턴. (0) | 2012.05.18 |
테이블 함수 예제 (0) | 2012.05.18 |