상세 컨텐츠

본문 제목

계층형 데이타 Query

DataBase/Oracle

by 탑~! 2012. 5. 18. 15:50

본문

 

-- 정전개
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 을 의미한다.

'DataBase > Oracle' 카테고리의 다른 글

힌트 사용 방법  (0) 2012.05.21
숫자를 한글로 표기하는 Function  (0) 2012.05.21
테이블 함수 예제 2  (0) 2012.05.18
문자열 수식을 입력받아 계산된 값 리턴.  (0) 2012.05.18
테이블 함수 예제  (0) 2012.05.18

관련글 더보기