[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; -- 뷰 조회

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

그렇다.


참조
https://www.postgresql.org/docs/9.1/queries-with.html