2014-01-22 44 views
0

我有一張通過引用自身來表示層次結構的表。在Postgres中獲取麪包屑

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

給定一個特定的節點,我想按順序查找它的所有父母,如麪包屑。例如,給定數據:

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=5我希望的結果是:

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」嗎?我認爲n.id會不明確,除非sql隱含地映射n的先前定義。 –

+0

表別名不會跨越查詢之間的UNION ALL邊界;在'A UNION B'中,'A'和'B'查詢有它們自己的命名空間。 –