1. start with 절에 명시된 루트노드에 해당되는 로우를 찾는다
  2. 루트노드에서 파생된 자식노드에 해당하는 로우를 찾는다. 각각의 자식노드는 루트노드와 connect by 절에 명시된 조건에 만족하는 로우가 된다
  3. 루트노드에 해당되는 자식노드를 찾으면, 그 자식노드와 다시 부모-자식 관계를 갖는 로우를 찾는다. 여기에서는 이전 단계에서의 자식노드가 다시 부모노드가 되며, 그 부모노드와 connect by 절의 조건에 부합되는 자식노드를 다시 검색하면 된다. 이런 절차를 반복해서 최종적으로 리프노드에 해당되는 로우가 나올 때까지 검색을 수행한다.
  4. 리프노드까지 찾은 후에는 다시 2번 과정을 반복하며 가장 마지막 리프노드에 해당되는 로우를 찾을 때까지 검색 한다.
  5. 쿼리에서 where 절에 조인 이외의 조건이 있는 경우, 지금까지 검색된 로우에서 where 절의조건을 만족하지 않는 로우들을 제거한다. 이 경우 오라클은 where 절에 명시된 조건을 만족하지 않는 모든 자식노드에 해당하는 로우들을 한 번에 없애지 않고, 계층형 쿼리의 결과로 검색된 각각의 자식노드를 검색하여 조건에 맞지 않는 로우를 제거한다.


오라클이 계층형 쿼리를 처리하는 순서
  1. 조인이 사용되었다면 가장 먼저 조인을 먼저 처리한다.
  2. 그 다음으로 connect by 조건을 처리한다.
  3. 마지막으로 나머지 조건(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 ==> 마지막 소팅 컬럼

+ Recent posts