오라클 CONNECT_BY_ISLEAF 관련 질문입니다. 0 4 1,773

by 박태준 [2016.12.16 14:10:38]


조회쿼리 실행시 계층형 쿼리를 통하여 하위부서가 없을시 CONNECT_BY_ISLEAF을 사용하여

구분하는 쿼리를 작성했습니다.

예를 들면

 

SELECT LEVEL "level", CONNECT_BY_ISLEAF AS "O_LEAF", T.* FROM TABLE T

WHERE COLUM1 IS NULL

START WITH  ~

CONNECT BY PRIOR ~
       
ORDER SIBLINGS BY ~

쿼리와 

 

SELECT LEVEL "level", CONNECT_BY_ISLEAF AS "O_LEAF", T.* FROM TABLE T

WHERE 

START WITH  ~

CONNECT BY PRIOR ~

AND COLUM1 IS NULL
       
ORDER SIBLINGS BY ~

 

쿼리가 있습니다 

 

조건값을 계층형 쿼리 위에 두느냐 아래에 두느냐의 차이입니다.

그런데 데이터 CONNECT_BY_ISLEAF 값을 틀렸습니다.

이유가 무엇인가요? 데이터가 맞는것은 2번째 쿼리였습니다.

위에서 아래로 실행된다는 논리라면 

첫번째 쿼리처럼 COLUM1을 제외하고 계층형쿼리를 실행하는게 더 올바른 방식이 아닌가요?

그런데 결과값은 밑의 쿼리가 맞아서 혼동이 오네요..

 

 

by 마농 [2016.12.16 14:47:17]

조건절이 3개가 있는데요. 실행 순서는 다음과 같습니다.
 1. WHERE 절의 조인 조건 : 계층 전개 시작 전에 적용됨
 2. START WITH : 계층 시작 조건
 3. CONNECT BY : 계층 전개 조건
 4. WHERE 절의 필터 조건 : 계층 전개 끝난 뒤에 적용됨


해당 조건이
 - 시작 레벨에 적용되어야 한다면? Start With
 - 전개할때 적용되어야 한다면? Connect By
 - 전개 후에 최종 적용되어야 한다면? Where
전개 전에 모두 적용되어야 한다면? 다음 두가지 방법이 있습니다.
 - Start With 와 Connect By 에 모두 주기
 - 인라인뷰 안에서 미리 조건 주기


by 박태준 [2016.12.16 17:26:58]

풀이해서 적어주셔서 이해가 잘됩니다

정말 감사합니다.^^


by jkson [2016.12.16 14:48:38]

COLUM1 IS NULL은 무슨 데이터 걸러주려고 사용하신 거죠?


by 박태준 [2016.12.16 15:25:48]

coloum1은 특정한 부서가 존재하는지 않하는지를 판단하는 컬럼입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입