본문 바로가기
DBMS/PostgreSQL

[PostgreSQL] WITH RECURSIVE 구문 - 재귀쿼리, 계층쿼리

by 썸머워즈 2021. 10. 9.
반응형

PostgreSQL에서 WITH RECURSIVE 구문을 사용하여 반복문처럼 사용이 가능하다.

재귀적 쿼리인데 이는 보통 테이블 데이터가 계층형일때 많이 사용된다.

 

▷ 구문

WITH RECURSIVE recursive_name [(column1, ...)] AS (
   -- initial query (처음 호출하는 쿼리)
   -- non-recursive query
   SELECT [(column1, ...)]
   UNION [ALL]
   -- recursive query (반복 쿼리)
   SELECT [(column1, ...)] FROM recursive_name [WHERE]
)
-- parent query

SELECT * FROM recursive_name

 

WITH RECURSIVE 구문을 통해 쿼리가 반복되며,

반복된 결과를 parent query 영역에서 FROM 절로 가져와 사용하는 구조이다.

 

UNION 다음에 사용되는 recursive query 즉, 재귀쿼리문에서는 보통 where 조건을 통해 반복이 멈추도록 제한을 둔다.

 

구문에 대해 어느정도 알았다면 예제를 통해 접해보자.


▷ 예제1) WITH RECURSIVE 기본 사용법

WITH RECURSIVE mine_record AS (
   SELECT 1 AS num
   UNION ALL
   SELECT num + 1 FROM mine_record WHERE num < 10
)
SELECT * FROM mine_record

 

▷ 결과

▷ 예제2) 계층형 쿼리

 - 계층형 쿼리를 진행하기에 앞서 이해를 돕기 위해 아래와 같은 데이터 구조를 가지고 있다고 가정하고 시작한다.

초기 데이터

WITH RECURSIVE dept_record(dept_sn, parent_sn, dept_name, dept_ctn, level, path, cycle) 
AS(
   SELECT d.dept_sn, d.parent_sn, d.dept_name, d.dept_ctn, 0, ARRAY[d.dept_sn], false
   FROM dept d
   WHERE d.parent_sn IS NULL
   
   UNION ALL
   
   SELECT d.dept_sn, d.parent_sn, d.dept_name, d.dept_ctn, level + 1, path || d.dept_sn, d.dept_sn = ANY(path)
   FROM dept d, dept_record dr
   WHERE d.parent_sn = dr.dept_sn
   AND NOT CYCLE
)
SELECT dept_sn, parent_sn, dept_name, dept_ctn, level, path 
FROM dept_record
ORDER BY path

 

▷ 결과

결과 데이터

 

쿼리가 반복되는 부분에 dept_sn을 배열로 담은 path에 각각의 dept_sn을 추가해 계층형 쿼리가 완성됐다.

 

위 예제에서 사용되는 cycle은 성능상 추가된것인데,

path에 이미 추가된 데이터에 대해서는 더이상 검색을 수행하지 않게 중복 처리를 제한것이다.

 

참고 : http://happy1week.blogspot.com/2012/07/postgresql_19.html

 

PostgreSQL 계층형 쿼리 따라하기

PostgreSQL에서는 오라클에서 계층형 쿼리라고 표현하는 start with, connect by 구문을 지원하지 않는다. 따라서 PostgreSQL에서 데이터를 계층형의 트리 구조로 표현하기 위해 RECURSIVE 키워드를 사용하여

happy1week.blogspot.com

반응형


댓글

TOP