• 일반 CTE + 재귀 기능
• 자기 자신을 반복 호출해서 계층적/트리구조 탐색
• 일반적으로 부모-자식 관계, 조직도, 폴더구조 등에서 사용
• WITH RECURSIVE 키워드를 사용함
WITH RECURSIVE cte_name AS (
-- Anchor member (초기값)
SELECT ...UNION ALL
-- Recursive member (반복)
SELECT ...
FROM cte_name
JOIN ...
ON ...
)
SELECT * FROM cte_name;

⸻
WITH RECURSIVE numbers AS (
-- Anchor member: 시작값 1
SELECT 1 AS num
UNION ALL
-- Recursive member: 숫자를 1씩 증가
SELECT num + 1
FROM numbers
WHERE num < 10
)
SELECT * FROM numbers;

CREATE TABLE employees (
id INT,
name VARCHAR(50),
manager_id INT
);
id name manager_id
1 CEO NULL
2 A 1
3 B 1
4 C 2
5 D 2
6 E 3
WITH RECURSIVE employee_hierarchy AS (
-- Anchor member: 최상위 관리자 찾기
SELECT id, name, manager_id, 1 AS level
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- Recursive member: 부하직원 찾기
SELECT e.id, e.name, e.manager_id, eh.level + 1
FROM employees e
JOIN employee_hierarchy eh
ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;
id name manager_id level
1 CEO NULL 1
2 A 1 2
3 B 1 2
4 C 2 3
5 D 2 3
6 E 3 3
⸻
• Anchor → Recursive → Anchor → Recursive → … 반복
• 종료 조건은 명시적으로 적지 않아도,
더 이상 JOIN이 안 되는 순간 자동 종료됨.
• 일반적으로 UNION ALL을 사용 (중복 걱정 없으므로).
⸻
