본문 바로가기
IT개발

계층형쿼리 START WITH ~ CONNECT BY PRIOR

by 팀모 2023. 8. 28.

아래 테이블을 START WITH ~ CONNECT BY 절을 사용하여 계층형 쿼리를 만들어보고자 합니다.

START WITH [조건] : [조건]에 맞는 레코드를 일단 조회합니다. 그결과를 기준으로 계층연결을시작합니다
CONNECT BY [조건] : [조건]에 맞게 연결해 나갑니다.
이때 CONNECT BY절에 PRIOR이 어디에 붙느냐에 따라 결과값이 달라지므로 주의할 필요가 있습니다.
컬럼명앞에 PRIOR 붙어있는 컬럼의 값을 일단읽고 그 값으로 다음 조건절을 수행하게 됩니다.
 
아래 구문을 해석하자면 
START WITH cd = '0'   :  컬럼명 cd의 값이 '0'인 레코드를 찾습니다.
찾은레코드에서 PRIOR이 붙은 'cd'의 값을 읽고 조건절 cd = pcd 절을 수행합니다.
그렇게 되면 cd값이 0이므로 pcd = '0' 인 레코드를 가져오고 그이후에 또 connect by절을 계속 수행하게되며 아래와 같은 결과값을 얻을 수 있습니다.

만약 prior이  pcd 앞에 붙어있다면 start with cd ='0'인 레코드의 pcd값을 읽고,
pcd의 값이 null이기때문에 cd가 null인 컬럼을 찾으려고 합니다.

 
계층형 쿼리에서 조건을 아래와 같이 넣게되면
계층형쿼리로 우선 조회한 다음 where절을 마지막으로 수행하기때문에 cd가 '2000'아닌 레코드를 가져오게 됩니다.
그렇다보니 아래 결과값과 같은 pcd가 '2000'인 레코드들은 조회가 됩니다.

그래서 아예 계층형쿼리를 수행하는 시점부터 조건을 걸어서 pcd가 2000이 아닌것도 제외시키려면 방법이 두가지가 있습니다.
 
1) select문을 where절을 먼저 수행할 수 있게끔 한번 더감싸서 계층형 쿼리를 작성하는 방법

 
2) CONNECT BY절에 조건절 작성

 
ORDER SIBLINGS BY [컬럼명] : 계층형쿼리내에서도 형제계층끼리의 정렬
ORDER BY 사이에 SIBLINGS를 넣지않으면 형제계층 내에서가 아닌 전체에서 ORDER BY를 하게되므로 주의합니다.

 
SYS_CONNECT_BY_PATH([보여질 컬럼명],[구분자]) 를 이용해서 계층형 쿼리의 경로를 보여줄 수 있습니다.

SYS_CONNECT_BY_PATH  함수를 이용하면 특정 계층만 가져오는 조건이 필요할 때 용이하게 사용할 수 있습니다.
예를들어 nm = '연구개발' 소속만 가져오고자 한다면 
계층형 쿼리를 select문으로 한번 더 감싼 후 조건절 where path like '/팀모카/연구개발%' 을 적어주면
레코드중에서 path = '/팀모카/연구개발' 로 시작하는 레코드들만 추려낼 수 있습니다.  

이상 계층형쿼리 설명을 마치도록 하겠습니다.