재귀 쿼리

트리를 RDBMS에 넣으려고 하면 id와 parent_id를 만들어서 나타낼 수 있다. 대충 만들어보면 다음과 같은 테이블이 나온다.

CREATE TABLE tree_message (
 id INT PRIMARY KEY AUTO_INCREMENT,
 parent_id INT REFERENCES tree_message(id),
 message TEXT
)

내가 원하는 건 어떤 행의 모든 부모 행을 가져오는것이다. 단순히 생각하면 걍 여러번 쿼리를 때리면 되는데 이걸 한번에 할 수는 없을까? 하고 ChatGPT에게 물어보니 바로 가르쳐줌 쉬발;

WITH RECURSIVE ancestors AS (
 SELECT id, parent_id, message
 FROM tree_message
 WHERE id = <taret_id>

 UNION ALL

 SELECT t.id, t.parent_id, t.message
 FROM tree_message AS t
 JOIN ancestors AS a ON t.id = a.parent_id
) SELECT * FROM ancestors

로 하면 된다. 그다지 깊지 않은 경우엔 재귀쿼리가 낫고 매우 깊어질 가능성이 있는 경우엔 기존처럼 여러번 쿼리 때리는게 나을 듯

Postgresql 17과 MariaDB 10.11 에서 테스트 해봤는데 잘 된다.

끗.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다