PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:ciclo finché una condizione non è vera

Il tuo pensiero è sbagliato per SQL. Non pensare in termini di cicli, condizioni e variabili; invece, pensa a come descrivere i dati che desideri. La parte difficile è che vuoi che la query faccia riferimento ai propri risultati e questo è ciò che CTE ricorsive sono per:

Stai cercando qualcosa del genere:

with recursive path as (
    select id, parent from T where id = 4
    union all
    select t.id, t.parent from T t join path p on t.id = p.parent
)
select id, parent
from path

Questo ti darà questo:

 id | parent 
----+--------
  4 |      2
  2 |      1
  1 |       

e quindi puoi rimetterlo insieme in un percorso che sarebbe più linkato (o qualunque cosa sia appropriato nella lingua del tuo client) al di fuori del database. Non è necessario includere parent ovviamente, ma includerlo ti aiuterà a correggere i "puntatori".