2013-10-20 1 views
1

이것은 매우 일반적인 질문입니다. 나는 SO에 대한 특정 문제에 대한 몇 가지 질문과 토론을 발견,하지만 난 당신의 대부분은 이미 해결 한 것을 매우 확신이 하나루트 요소 postgres에 대한 CTE 쿼리

입력 :

  1. 하나의 트리 구조를 가지고 테이블 들.
  2. 데이터베이스 레코드의 임의의 ID는 x입니다.

질문 :

가 어떻게 x의 트리의 루트를 얻을 수 ?

이 재귀 적으로 구현하는 방법이 있어야한다는 것을 알았지 만 아직 성취 할 수 없었습니다.

+2

문서에는 좋은 예제가 있습니다. 그들을 사용해 보셨습니까? –

답변

6

루트 요소는 주어진 루트의 자식 요소와 동일한 방식으로 찾을 수 있지만
이지만 쿼리는 반대 방향으로 검색해야합니다. >http://www.sqlfiddle.com/#!12/5952b8/7이 쿼리는 주어진 루트의 모든 어린이 검색


:

WITH RECURSIVE childs(id, parent_id) 
AS (
    -- get parent 
    SELECT id, parent_id 
    FROM tab 
    WHERE id = 10 

    UNION ALL 

    -- get all children 
    SELECT t.id, t.parent_id 
    FROM childs c 
    JOIN tab t 
    ON t.parent_id = c.id 
) 
SELECT * from childs; 

를이 쿼리가 주어진 자식 노드의 모든 부모를 검색합니다

- :

는 간단한 데모를 살펴 보자
WITH RECURSIVE parents(id, parent_id) 
AS (
    -- get leaf children 
    SELECT id, parent_id 
    FROM tab 
    WHERE id = 14 

    UNION ALL 

    -- get all parents 
    SELECT t.id, t.parent_id 
    FROM parents p 
    JOIN tab t 
    ON p.parent_id = t.id 
) 
SELECT * from parents 
-- WHERE parent_id is null; 

루트 노드 만 필요한 경우, 절 WHERE parent_id IS NULL은 루트를 제외한 모든 것을 필터링합니다.