2016-01-22 7 views
5
ここ

に指定された子から親の階層全体を取得しますが、データのサンプルが、私が見ていている再帰クエリを使用して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、関連するすべての子を取得します。

私の質問は、どのように子供から始めることができ、関連する両親や祖父母などを根元まで得ることができます。すべてのヘルプをいただければ幸いです

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

ので、子供の#9与えられた、私は次のことを返すクエリをしたいと思います。このよう

答えて

7

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

+0

おかげで、ニール・mcguian @、それをやりました!コンピュータが宇宙を使い果たすまでクエリが連続して実行されるので、私は 'union all'を' union 'に変更しなければなりませんでした。 'union'だけで、クエリはすばやく実行され、結果はまさに私が望むものでした。 – randymay