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
)