숫자 시퀀스
Coddy SQL 여정의 심화 과정 섹션에 포함된 레슨 — 27개 중 20번째.
여러분은 서브쿼리에 이름을 붙이기 위해 기초(Fundamentals) 과정에서 WITH 키워드를 만났습니다. 이는 CTE(Common Table Expression)라고도 불립니다. 재귀적(recursive) CTE는 여기서 한 걸음 더 나아갑니다. 서브쿼리가 자기 자신을 참조할 수 있게 하여, 결과를 행 단위로 쌓아 올립니다.
가장 간단한 버전은 기본 테이블 없이 숫자 시퀀스를 생성합니다. 형태는 항상 동일합니다:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- 앵커: 시작 행
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- 재귀: 이전 행으로부터 다음 행을 생성
)
SELECT n FROM counter다음과 같이 해석하세요: n = 1로 시작하여, 각 n이 이전 n + 1인 행을 계속 추가하다가 WHERE 절이 더 이상 일치하지 않으면 중단합니다. 결과는 1, 2, 3, 4, 5입니다.
본문의 두 부분은 UNION ALL로 결합됩니다. 첫 번째는 앵커(anchor)입니다: 시드 행(seed rows)을 의미합니다. 두 번째는 재귀 단계(recursive step)입니다: CTE 자체를 쿼리합니다.
챌린지
쉬움두 개의 컬럼을 가진 powers라는 이름의 재귀적 CTE를 작성하세요:
i:1에서 시작하는 반복 인덱스p:2의i승 (2,4,8, …)
p가 1000을 초과하면 중단하세요. 두 컬럼을 모두 반환하고, i를 기준으로 오름차순 정렬하세요.
치트 시트
재귀적 CTE를 사용하면 서브쿼리가 자기 자신을 참조할 수 있어, 결과를 한 행씩 빌드할 수 있습니다:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- anchor: 시작 행
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- recursive step: 재귀 단계
)
SELECT n FROM counter- 앵커(Anchor): 시드 행(들) (첫 번째
SELECT) - 재귀 단계(Recursive step): 다음 행을 생성하기 위해 CTE 자체를 쿼리합니다
WHERE조건이 더 이상 일치하지 않을 때 중단됩니다- 두 부분은
UNION ALL로 결합됩니다
직접 해보기
WITH RECURSIVE powers(i, p) AS (
-- 앵커: i=1, p=2
-- 재귀: i+1, p*2, p가 1000에 도달할 때까지
)
SELECT i, p FROM powers ORDER BY i
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.