더북(TheBook)

③ 메인쿼리

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로 작성해 보세요.

정답 및 해설

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