2014-01-22 2 views
0

자체를 참조하여 계층 구조를 나타내는 테이블이 있습니다.Postgres에서 빵 부스러기 얻기

create table nodes (
    id integer primary key, 
    parent_id integer references nodes (id), 
    name varchar(255) 
); 

특정 노드가 주어 졌을 때, 나는 모든 부모를 순서대로 빵 부스러기로 발견하고 싶습니다. 나는 결과가있을 것으로 예상 것 id=5에서 시작하고 싶었다면

insert into nodes (id,parent_id,name) values 
(1,null,'Root'), 
(2,1,'Left'), 
(3,1,'Right'), 
(4,2,'LeftLeft'), 
(5,2,'LeftRight'), 
(6,5,'LeftRightLeft'); 

: 예를 들어,이 데이터를 주어진 깊이 열이있는 경우 난 상관 없어

id | depth | name 
-- | ----- | ---- 
1 | 0  | 'Root' 
2 | 1  | 'Left' 
5 | 2  | 'LeftRight' 

,하지만 난 명확성을 위해 각 깊이에 대해 하나의 결과 만 있어야하며 결과는 깊이 순서로 표시되어야 함을 나타냅니다. 오름차순인지 내림차순인지 상관하지 않습니다.

(1)Root \ (2)Left \ (5)LeftRight 

답변

2

기본 재귀 쿼리는 다음과 같이 보일 것이다 :

with recursive tree(id, name, parent_id) as (
    select n.id, n.name, n.parent_id 
    from nodes n 
    where n.id = 5 
    union all 
    select n.id, n.name, n.parent_id 
    from nodes n 
    join tree t on (n.id = t.parent_id) 
) 
select * 
from tree; 

데모 : http://sqlfiddle.com/#!15/713f8/1

이 그 것이다 이것의 목적은 다음과 같이 몇 가지 빵 부스러기를 인쇄 할 수있다 id = 5에서 다시 루트로 다시 만드는 데 필요한 모든 것을 제공하십시오.

+0

둘 다 레이블을 지정해도 상관 없습니까? "n"이 있습니까? 나는 sql이 암시 적으로 n의 이전 정의를 음영하지 않는 한 n.id가 모호 할 것이라고 생각한다. –

+0

테이블 별칭은 쿼리 간의 UNION ALL 경계를 넘지 않습니다. 'A UNION B'에서'A'와'B' 질의는 그들 자신의 네임 스페이스를 가지고 있습니다. –