- start with 절에 명시된 루트노드에 해당되는 로우를 찾는다
- 루트노드에서 파생된 자식노드에 해당하는 로우를 찾는다. 각각의 자식노드는 루트노드와 connect by 절에 명시된 조건에 만족하는 로우가 된다
- 루트노드에 해당되는 자식노드를 찾으면, 그 자식노드와 다시 부모-자식 관계를 갖는 로우를 찾는다. 여기에서는 이전 단계에서의 자식노드가 다시 부모노드가 되며, 그 부모노드와 connect by 절의 조건에 부합되는 자식노드를 다시 검색하면 된다. 이런 절차를 반복해서 최종적으로 리프노드에 해당되는 로우가 나올 때까지 검색을 수행한다.
- 리프노드까지 찾은 후에는 다시 2번 과정을 반복하며 가장 마지막 리프노드에 해당되는 로우를 찾을 때까지 검색 한다.
- 쿼리에서 where 절에 조인 이외의 조건이 있는 경우, 지금까지 검색된 로우에서 where 절의조건을 만족하지 않는 로우들을 제거한다. 이 경우 오라클은 where 절에 명시된 조건을 만족하지 않는 모든 자식노드에 해당하는 로우들을 한 번에 없애지 않고, 계층형 쿼리의 결과로 검색된 각각의 자식노드를 검색하여 조건에 맞지 않는 로우를 제거한다.
오라클이 계층형 쿼리를 처리하는 순서
- 조인이 사용되었다면 가장 먼저 조인을 먼저 처리한다.
- 그 다음으로 connect by 조건을 처리한다.
- 마지막으로 나머지 조건(where 절에서 조인 이외의 조건)을 처리한다.
계층형 쿼리의 확장
루트노드 찾기 : CONNECT_BY_ROOT
중복 참조값 찾기 : CONNECT_BY_ISCYCLE
리프노드 찾기 : CONNECT_BY_ISLEAF
루트 찾아가기 : SYS_CONNECT_BY_PATH
SELECT t.no, t.parentno, lpad(t.no, t.lev * 10), t.lev
FROM test t
START WITH t.parentno=0 ==>계층형 쿼리의 부모로 사용될 행 지정
CONNECT BY PRIOR t.no=t.parentno==> 자신키 = 부모키
ORDER SIBLINGS BY t.no ==> 마지막 소팅 컬럼