③ 메인쿼리

    SELECT employee_id, emp_name, level, path,
           CONCAT(LPAD('', 2 * level, ' '), emp_name) hier_name
      FROM cte1
     ORDER BY path;

    마지막 SELECT 문인 메인쿼리에서는 서브쿼리 cte1의 사번, 사원명, 레벨, 경로 정보를 조회합니다. CONCAT(LPAD('', 2 * level, ' '), emp_name)LPAD() 함수를 사용해 레벨별로 왼쪽에 공백을 추가하고 이를 emp_name 칼럼과 결합해서 레벨별로 들여쓰기한 효과를 냅니다. 100번은 1레벨이므로 2 × 1 = 2가 되어 공백 2칸과 emp_name 값이 붙어 조회됩니다. 101번은 2레벨이므로 2 × 2 = 4가 되어 공백 4칸과 이름이 붙어 조회되고요. 마지막으로 ORDER BY 절에서 path를 명시해 최종 결과를 계층 구조로 보게 됩니다.

    재귀 CTE는 앞에 나온 쿼리들보다 좀 어렵지만, 첫 번째 SELECT 문에서 반복을 시작하고 두 번째 SELECT 문의 FROM 절에서 서브쿼리 자신을 참조 순환하며 반복해서 처리한다는 점을 기억하면 됩니다.

    마지막으로 재귀 CTE를 사용할 때 제한 사항이 있는데, 서브쿼리 안의 반복 쿼리인 두 번째 SELECT 문에서는 집계 함수와 GROUP BY, ORDER BY 절을 사용할 수 없습니다.

    1분 퀴즈 1

    2021년 1월 1일부터 2021년 12월 31일까지 날짜별로 365개의 로우를 반환하는 쿼리를 CTE로 작성해 보세요.

    정답 및 해설

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