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
)
'Server > DB' 카테고리의 다른 글
순위함수 ROW_NUMBER(), RANK(), DENSE_RANK() (0) | 2025.04.03 |
---|---|
SQL 서브쿼리의 종류와 특징 (0) | 2025.03.31 |
CASE, IF( ) (0) | 2025.03.30 |
WHERE VS GROUP BY (0) | 2025.03.30 |
입문반 커리큘럼, 혼자 정리해보기 - 소수점을 처리하는 함수 (0) | 2025.03.30 |