150320 계층형 쿼리
★★
-원리를 이해할것
-굉장히 많이 사용
- 계층이 엄청 깊기 때문에 잘라서 출력 해야함
읽는 순서
① 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에 제일 높은 것을 출력