UNION ALL로 연결된 두 번째 SELECT 문은 재귀 쿼리로, 반복되는 부분입니다. FROM 절에 자기 자신인 cte1을 명시하고, 초기 쿼리가 반환하는 칼럼명인 dates에 ADDDATE() 함수로 1일씩 더합니다. 1월은 31일까지 있으므로 WHERE 절에서 더해진 날짜가 2019년 1월 31일보다 작거나 같다는 조건을 줍니다. 따라서 2019년 1월 1일부터 1월 31일까지 31개의 로우가 반환됩니다.
SELECT 절에서는 dates 칼럼과 COUNT() 함수로 날짜별 건수(개봉편수)를 구합니다. 그리고 cte1 서브쿼리와 box_office 테이블을 외부 조인하며 개봉일자가 같다는 조인 조건을 줍니다. 결국 cte1이 반환하는 31개 날짜와 같은 날에 개봉한 영화 건수가 조회되고, 해당 날짜에 개봉된 영화가 없다면 0이 조회되죠. 결과를 보면 개봉 영화가 없는 1월 2일이나 1월 6일은 개봉 건수가 0으로 조회됩니다.
이처럼 재귀 CTE의 반복 순환을 이용하면 연속적인 로우를 생성하는 효과를 낼 수 있습니다.