Server/DB
재귀 CTE 정리 (코딩 테스트용)
고감귤
2025. 4. 22. 22:03
CTE(Common Table Expression) = 일시적인 결과 테이블.
그 중에서 자기 자신을 재참조하는 걸 재귀 CTE라고 부름.
MySQL, PostgreSQL, SQL Server 등에서 사용 가능.
Oracle은 CONNECT BY 같은 다른 방식 사용.
기본 문법
-- 기본 문법
WITH RECURSIVE CTE_NAME (columns...) AS (
-- anchor member (초기값)
SELECT ...
FROM ...
UNION ALL
-- recursive member (자기 자신 호출)
SELECT ...
FROM CTE_NAME
JOIN ...
)
SELECT * FROM CTE_NAME;
- 첫 SELECT: 시작점 (anchor)
- 두 번째 SELECT: 재귀적으로 연결 (recursive step)
- UNION ALL 필수 (중복 제거 X, 성능 저하 방지)
코딩 테스트 예제
https://school.programmers.co.kr/learn/challenges?order=acceptance_asc&page=5&languages=mysql
각 대장균(ID)이 몇 번째 세대인지 나타내는 테이블을 작성하시오.
예) ID = 7 → 1세대(ID=2) → 2세대(ID=4) → 3세대(ID=7) ⇒ 3세대
WITH RECURSIVE TMP AS (
SELECT
ID,
1 AS GENERATION
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
SELECT
E.ID,
TMP.GENERATION + 1 AS GENERATION
FROM ECOLI_DATA E
JOIN TMP ON E.PARENT_ID = TMP.ID
)