예문 >>
SELECT *
FROM employee A
CONNECT BY PRIOR A.emp_id = A.manager_emp_id
AND A.emp_id <> '1002'
START WITH A.emp_id = '1001'
AND EX_YN = 'Y'
1. START WITH는 처음 시작할 조건을 의미합니다.
즉, '1007' 이면서 'Y'인 로우부터 출발합니다.
2. CONNECT BY는 1.의 데이터와 연결된 로우를 반복하여 찾습니다.
PRIOR 과 가까운 쪽의 컬럼(EMP_ID)이 '1007'의 컬럼이고, 반대쪽이 다른 로우의 컬럼입니다.
즉, 나의 EMP_ID ('1007')를 manager_emp_id 로 갖는 로우를 찾는 것입니다. (내 부하직원)
쉽게 생각해 Prior쪽의 컬럼이 하위이면 밑으로, 상위코드이면 위로 찾는 구조입니다.
CONNECT BY와 START WITH의 순서는 의미가 없습니다. (AND가 없을 때)
다만, AND의 위치가 FROM절, CONNECT BY, START WITH 다음의 어디냐에 따라 의미가 다릅니다.
START WITH 밑에 있으면 '1007' 이면서 동시에 'Y'이어야 함을 의미합니다. (출발)
CONNECT BY 다음의 AND 는 순환 관계를 풀면서 AND 조건을 만족하지 않으면 그 다음 레벨은 더 이상 진행하지 않음을 의미합니다.
SELECT *
FROM employee A
CONNECT BY PRIOR A.emp_id = A.manager_emp_id
AND A.emp_id <> '1002'
START WITH A.emp_id = '1001'
AND EX_YN = 'Y'
; -- '1001'의 하위인 '1002'가 AND 조건에 맞지 않으므로 '1002'의 하위인 '1007','1009'는 조회되지 않는다.
결과
EMP_ID MANAGER_EMP_ID EX_YN
1001 1000 Y
1003 1001 Y
1010 1003 Y
1008 1001 Y
FROM 절 다음의 WHERE는 순환구조를 모두 전개 한 후에 조건에 해당하는 로우만 추출합니다.
SELECT *
FROM employee A
WHERE A.emp_id <> '1002'
CONNECT BY PRIOR A.emp_id = A.manager_emp_id
START WITH A.emp_id = '1001'
AND EX_YN = 'Y'
; -- '1002'의 하위인 '1007','1009'를 전개 한 후 '1002'만 걸러냄.
결과
EMP_ID MANAGER_EMP_ID EX_YN
1001 1000 Y
1007 1002 Y
1009 1002 Y
1003 1001 Y
1010 1003 Y
1008 1001 Y
/ 참고 스크립트
create table employee(emp_id number, manager_emp_id number, EX_YN varchar2(1));
insert into employee values(1001,1000,'Y');
insert into employee values(1002,1001,'Y');
insert into employee values(1003,1001,'Y');
insert into employee values(1007,1002,'Y');
insert into employee values(1008,1001,'Y');
insert into employee values(1009,1002,'Y');
insert into employee values(1010,1003,'Y');
*/
출처 : http://c36wn.egloos.com/4350031SQL >
select substr(max(sys_connect_by_path(col_name,',')),2) as alias , col_name, rnum
from (
select tab_id, col_name, rownum rnum from COLUMNS
where rownum <=20
)
start with rnum=1
connect by prior rnum = rnum -1
group by col_name, rnum
order by rnum;
결과 .. 이런 트리 구조.. -0- 신기신기~
'DataBase > Oracle SQL' 카테고리의 다른 글
[ORACLE] instr() 함수 (0) | 2010.02.22 |
---|---|
[ORACLE] SIGN 함수 (0) | 2010.02.22 |
[SQL] Oracle Decode() 함수 & case when ~ then ~ end 문 (0) | 2010.02.03 |
[SQL] FLASHBACK 테이블 Drop 후 복구 (0) | 2010.02.03 |
[SQL] 9장 Object, 권한주고뺏기 (0) | 2010.01.18 |