본문 바로가기

DB/Oracle

[ORACLE]START WITH ~ CONNECT BY PRIOR

 

작성하신 쿼리는 정상 수행됩니다.

 

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');

*/

출처 : 네이버 지식iN

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

오라클과 MSSQL 함수비교  (0) 2010.04.21
[ORACLE] Group by, Rollup, Cube의 차이점  (0) 2010.03.23
[ORACLE] CONNECT BY  (0) 2010.03.09
ORACLE HINT 정리  (0) 2010.03.09
I. Oracle에서의 SYS_CONNECT_BY_PATH 사용 목적과 흉내내기  (0) 2009.07.17