从Postgresql中的给定子项获取父级的整个层次结构

时间:2016-01-22 19:55:15

标签: sql postgresql

以下是我正在查看的数据示例:

表:

id     |    name    |   parent_id
_______|____________|______________
1      |Root        | null
2      |Parent #2   | 1
3      |Parent #3   | 1
4      |Parent #4   | 2
5      |Child #5    | 2
6      |Child #6    | 2
7      |Child #7    | 3
8      |Child #8    | 3
9      |Child #9    | 3

使用递归查询,我可以从Parent开始,并获取所有关联的子项。

我的问题是,如何从孩子开始,让所有相关的父母,祖父母等等,直到根。

所以,鉴于Child#9,我想要一个返回以下内容的查询:

id     |    name    |   parent_id
_______|____________|______________
1      |Root        | 0
3      |Parent #3   | 1
9      |Child #9    | 3

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:12)

像这样:

with recursive whosYourDaddy as (

  --start with the "anchor" row
  select
    *
  from foo
  where
    id = 9 --parameterize me

  union all

  select
    foo.*
  from foo 
  join whosYourDaddy on whosYourDaddy.parent_id = foo.id
)

select
  *
from whosYourDaddy 
order by
  id;

结果:

id  name      parent_id
-----------------------
1   Root      (null)
3   Parent 3  1
9   Child 9   3

代码:

http://sqlfiddle.com/#!15/a5fb9/12