재귀적 CTE(Common Table Expression)는 SQL에서 자기 자신을 참조하여 재귀적으로 데이터를 처리할 수 있는 방법을 제공하는 기능입니다. 재귀적 CTE는 계층 구조의 데이터를 처리하거나 반복적인 데이터를 생성하는 데 유용합니다.
기본 구조
재귀적 CTE는 두 부분으로 구성됩니다:
앵커 멤버(Anchor Member): 기본 쿼리를 정의하며, 재귀적 CTE의 초기 데이터 집합을 만듭니다.
재귀 멤버(Recursive Member): CTE 자신을 참조하여 반복적으로 데이터를 생성합니다. 이 과정은 재귀가 종료 조건을 만족할 때까지 계속됩니다.
WITH RECURSIVE CTE_NAME AS (
-- 앵커 멤버
SELECT ...
UNION ALL
-- 재귀 멤버
SELECT ...
FROM CTE_NAME
WHERE ...
)
SELECT * FROM CTE_NAME;
예제 1: 계층 구조 데이터
예를 들어, 직원 테이블에서 관리자를 기반으로 한 계층 구조를 찾는 경우:
WITH RECURSIVE EmployeeHierarchy AS (
-- 앵커 멤버: 최상위 관리자 찾기
SELECT EmployeeID, ManagerID, EmployeeName
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
-- 재귀 멤버: 관리자 아래 직원 찾기
SELECT e.EmployeeID, e.ManagerID, e.EmployeeName
FROM Employees e
INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID
)
SELECT * FROM EmployeeHierarchy;
예제 2
숫자 1부터 10까지 생성하는 예제:
WITH RECURSIVE Numbers AS (
-- 앵커 멤버: 숫자 1 생성
SELECT 1 AS Number
UNION ALL
-- 재귀 멤버: 이전 숫자에 1을 더하여 다음 숫자 생성
SELECT Number + 1
FROM Numbers
WHERE Number < 10
)
SELECT * FROM Numbers;
주의사항
무한 루프 방지: 종료 조건을 명확히 지정하지 않으면 무한 루프에 빠질 수 있습니다. 종료 조건을 반드시 설정하세요.
성능: 재귀적 CTE는 성능에 영향을 줄 수 있으므로, 최적화된 쿼리 작성이 필요합니다.
지원 여부: 모든 데이터베이스 시스템이 재귀적 CTE를 지원하는 것은 아닙니다. 사용하는 DBMS의 문서를 참고하세요.
재귀적 CTE는 복잡한 계층 구조 데이터를 처리하거나 반복적인 계산을 수행하는 데 매우 유용한 도구입니다. 이를 잘 활용하면 SQL 쿼리를 더욱 효율적이고 강력하게 만들 수 있습니다.