2016-01-22 5 views
5

Ecco un esempio dei dati Sto cercando:Ottenere intera gerarchia di genitori da un bambino Dato a PostgreSQL

Tabella:

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 

Utilizzando una query ricorsive, sono in grado di partire da un genitore e ottiene tutti i figli associati.

La mia domanda è: come posso iniziare dal bambino e ottenere tutti i genitori, i nonni, ecc. Relativi alla radice.

Quindi, dato Bambino # 9, vorrei una query che restituisce il seguente:

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

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

7

Ti piace questa:

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; 

Risultato:

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

Codice:

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

+0

Grazie, @ neil-mcguian, che lo ha fatto! Ho dovuto cambiare 'union all' in' union' dato che la query è continuata fino a quando il mio computer ha esaurito lo spazio. Con solo il 'union', la query è stata eseguita rapidamente e i risultati erano esattamente ciò che volevo. – randymay