[PostgreSQL] 재귀 쿼리 (계층형 쿼리)
PostgreSQL은 WITH 문의 확장을 통해 재귀반복을 수행할 수 있는 특수한 문법을 제공한다.
WITH RECURSIVE 키워드로 사용할 수 있다.
문법구조는 아래와 같다.
WITH RECURSIVE 뷰이름
AS
(
[반복 전 초기값(한번만 실행)]
UNION ALL
[반복구문(반환되는 레코드가 없으면 종료)]
)
...
여기서 [반복 전 초기값]은 한번만 실행이 되고 바로 해당 [뷰이름]에 바인딩이 돼서 반복구문에서 사용할 수 있다.
반복구문은 초기값을 기반으로 해서 레코드를 반환할 수 있는데, 각 반복구문의 반환값은 또 전과 같이 바로 [뷰]에 바인딩이 된다.
그리고 반복구문이 레코드를 반환하지 않을 때 반복이 종료되며, 이제까지 반환한 뷰 값들을 전부 묶어서 [뷰]에 최종 반영한다.
반복이 끝나고 나면 이 재귀 뷰도 일반 뷰와 동일하게 처리가 된다.
이를 응용한다면 이런식의 반복을 구현할 수 있다.
WITH RECURSIVE T(n) AS (
SELECT 1 --초기값
UNION ALL
SELECT n+1 FROM t WHERE n < 10 --10이 될때까지 반복
)
SELECT * FROM T; -- 뷰 조회

이외에도 조금만 응용한다면 그래프 구조의 재귀적 탐색 등을 편리하게 구현할 수 있다.
그렇다.