본문 바로가기
데이터베이스

Postgresql With Recursive, UNION ALL 사용한 계층형 쿼리

by so5663 2022. 9. 22.

Postgresql은 WITH RECURSIVE 구문으로 재귀쿼리로 사용가능하며 

계층형 쿼리로 만들때 많이 사용한다.

with recursive recursive_name [(column1,...)] as (

-- initial query (처음 호출하는 쿼리)   
SELECT [(column1, ...)]   
UNION [ALL]

-- recursive query (재귀 쿼리) 반복되는 부분
SELECT 
	[(column1, ...)] 
FROM recursive_name 
[WHERE]
)

-- parent query
SELECT * FROM recursive_name

 

이건 내 개인 프로젝트에서 사용하는 답글 기능을 추가한 댓글 리스트를 보여주는 쿼리다.

WITH RECURSIVE cte AS
(
    SELECT 
    a.rno,
    a.writer,
    a.regDate,
    a.content,
    a.parnt_rno,
    a.depth,
    rno as sort,
    CAST(rno AS char(99)) x
    FROM tbl_reply a
    WHERE parnt_rno = 0
    AND bno = #{bno}
    UNION ALL
    SELECT 
    a.rno,
    a.writer,
    a.regDate,
    a.content, 
    a.parnt_rno,
    a.depth,
    sort,
    CONCAT(b.x, '-', a.rno) x
    FROM tbl_reply a
    INNER JOIN cte b
    ON a.parnt_rno = b.rno
)
    SELECT
    *
    FROM cte
    order by x

UNION ALL 을 사용하여

여기서는 rno로 계층을 만들고 있다.  ex) 1-1 이런식으로