ORACLE/SQL

150320 계층형 쿼리

히드라야 2015. 3. 20. 11:48

★★

-원리를 이해할것 

-굉장히 많이 사용 

- 계층이 엄청 깊기 때문에 잘라서 출력 해야함 



읽는 순서

① start with 절에 시작조건

② connect by 절의 연결조건

③ where 절의 조건 검색 


문법

select lpad(ename , level * 4 , '*') "ename"

from emp 

connect by prior empno = mgr 

start with empno = 7839 ;

- empno 가 7839 기준이 됨 ☞  LEVEL 1 

- LEVEL1의 empno 값을 mgr 값으로 가지는 행들을 찾음 ☞ LEVEL2

- LEVEL2의 empno 값을 mgr 값으로 가지는 행들을 찾음 ☞ LEVEL3 

...안나올때 까지 반복 

※ 확인 결과 깊은 구간을 사용하기 위해서는 그 전 구간을 전부 확인하고 찾아가야 함


주의사항

1. CONNECT BY 절에는 Sub Query 를 사용할 수 없음

2. 대량의 데이터가 있을 경우에 시간이 오래 걸릴 수 있으므로 START WITH 절과

CONNECT BY 절, WHERE 절의 컬럼에는 반드시 인덱스가 적절하게 설정되어 있어야 합니다.

3.부분범위 처리 기법을 아쉽게도 계층형 쿼리에서는 사용할 수 없습니다


도와주는 함수

①CONNECT_BY_ISLEAF()

SELECT SYS_CONNECT_BY_PATH(ename, '->') "ORDER(LOW -> HIGH)"

FROM emp

WHERE CONNECT_BY_ISLEAF=1                 // 1: 마지막 값만 출력

//0 : 마지막을 제외하고 전부

START WITH empno=7369

CONNECT BY empno=PRIOR mgr ;

CONNECT_BY_ROOT

- 해당 level에 제일 높은 것을 출력