재귀쿼리에 대해 작성하기 전,
MySQL에서 메모리 상에 가상 테이블을 생성하는 쿼리인
WITH 절에 대한 이해가 필요했다.
WITH 절은 CTEs(Common Table Expressions)를 표현하는 구문으로,
CTEs는 기존의 뷰, 파생 테이블, 임시 테이블 등으로 사용되던 것들을 대신할 수 있고, 간결한 식으로 표현할 수 있는 장점이 있다.
CTEs는 재귀적CTE 와 비재귀적CTE 이렇게 두 가지 종류가 있는데,
오늘 작성해볼 것은 재귀적CTE에 대한 내용이다.
재귀적?
재귀는 자기 자신을 반복적으로 불러온다는 의미로 이해하면 쉽다.
WITH RECURSIVE
문 내부에 UNION을 활용해 재귀를 구성한다.WITH RECURSIVE 테이블명 AS
(
SELECT 1 AS n - # Non-Recursive 문장
(비재귀: 첫 루프만 실행)
UNION ALL - # 비재귀 행과 수직 결합
SELECT n + 1 AS num - # Recursive 문장
FROM 테이블명 (실행마다 행의 위치가 기억되어 다음 행으로 이동)
WHERE n < 10 - # 정지조건 (조건 내 n회 반복)
)
SELECT * FROM test;
WITH RECURSIVE TEST AS
(
SELECT 0 AS HOUR # 비재귀
UNION ALL
SELECT HOUR + 1 # 재귀
FROM TEST
WHERE HOUR < 23 # 재귀 정지 조건
)
SELECT * FROM TEST