👉 쉽게 말하면,
"시작값"을 정하고, "조건"을 주면서 계속 쌓아가는 방식이다.
보통 계층 구조(부모-자식)를 타고 내려가거나,
숫자, 날짜를 1씩 증가시키면서 생성할 때 사용한다.
WITH RECURSIVE CTE이름 AS (
-- 시작점
SELECT ...
UNION ALL
-- 다음으로 확장하는 규칙
SELECT ...
FROM CTE이름
WHERE 확장 조건
)
SELECT ...
FROM CTE이름;
SELECT로 초기값을 설정하고UNION ALL을 이용해 자기 자신을 반복 호출한다.WHERE로 언제까지 반복할지 조건을 건다.🐶 0시부터 23시까지 시간별로 입양이 몇 건 발생했는지 구하는 문제입니다.
시간대가 비어있어도(=입양이 0건이어도) 0부터 23까지 모두 출력해야 합니다.
📋 주어진 테이블:
ANIMAL_OUTSANIMAL_ID : 동물 IDDATETIME : 입양된 시간 (날짜+시간 정보 포함)✅ 목표:
HOUR 오름차순 정렬WITH RECURSIVE HOUR_N (HOUR) AS (
SELECT 0
UNION ALL
SELECT HOUR + 1
FROM HOUR_N
WHERE HOUR < 23
)
HOUR_N이라는 이름의 CTE를 만든다.SELECT A.HOUR, COUNT(B.ANIMAL_ID) AS COUNT
FROM HOUR_N A
LEFT JOIN ANIMAL_OUTS B
ON A.HOUR = HOUR(B.DATETIME)
GROUP BY A.HOUR
ORDER BY A.HOUR;
HOUR_N)과ANIMAL_OUTS 테이블을 LEFT JOIN한다.DATETIME의 시간을 HOUR() 함수로 추출해서 매칭한다.GROUP BY로 시간별로 묶고 정렬한다.WITH RECURSIVE HOUR_N (HOUR) AS (
SELECT 0
UNION ALL
SELECT HOUR + 1
FROM HOUR_N
WHERE HOUR < 23
)
SELECT
A.HOUR,
COUNT(B.ANIMAL_ID) AS COUNT
FROM HOUR_N A
LEFT JOIN ANIMAL_OUTS B
ON A.HOUR = HOUR(B.DATETIME)
GROUP BY A.HOUR
ORDER BY A.HOUR;
WITH RECURSIVE로 0 ~ 23까지 시간 생성한다. GROUP BY로 시간별 입양 건수를 센다. ✅ RECURSIVE CTE는 반복적으로 데이터를 생성할 때 강력하다.
✅ 이번 문제처럼 시간, 날짜를 하나씩 늘리면서 다루는 경우에 특히 유용하다.
✅ RECURSIVE를 쓰면 0~23시 모든 경우를 빠짐없이 만들 수 있다.
✅ 비어 있는 시간대도 LEFT JOIN으로 0건 처리할 수 있다.