더북(TheBook)

② 반복 쿼리

SELECT level + 1, b.employee_id, b.emp_name, CONCAT(a.path, ',', b.employee_id)
  FROM cte1 a
 INNER JOIN emp_hierarchy b
    ON a.employee_id = b.manager_id

계층형 쿼리는 최상위 로우를 시작점으로 해서 최상위 로우의 자식 로우를 찾고, 자식의 자식 로우를 찾는 과정을 자식 로우가 없을 때까지 반복합니다. 따라서 서브쿼리의 두 번째 SELECT 문은 자식 로우를 찾는 과정을 반복 수행합니다.

FROM 절에 자기 자신인 cte1을 명시하고 emp_hierarchy 테이블과 내부 조인하면서 a.employee_id = b.manager_id라는 조인 조건을 줍니다. 이는 순환하면서 해당 사원의 manager_id 값과 cte1의 employee_id 값이 같은 건을 반복적으로 가져오게 합니다. 그리고 SELECT 절이 반복되면서 level에 1을 더해 레벨을 계산하고, CONCAT() 함수로 기존 path 값에 콤마(,)와 해당 사원의 사번을 붙입니다.

결과로 설명하면, 계층의 꼭대기에 있는 100번은 초기 쿼리에서 이미 조회됐습니다. 그다음으로 manager_id가 100번인 사원을 찾는데, 101번 사원이 해당됩니다. 이 사원의 레벨은 level + 1을 해서 2가 되고, path는 100에 콤마와 자신의 사번을 더한 100, 101이 됩니다. 그러고 나서 manager_id가 101인 건을 찾는데, 이는 108번이 해당되고 이 사원은 2레벨에 1을 더한 3레벨, path는 100, 101에 자신의 사번을 붙인 101, 101, 108이 됩니다. 이런 식으로 조인 조건인 a.employee_id = b.manager_id를 만족하는 건을 찾아 계속 순환합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.