Din tankegang er forkert for SQL. Tænk ikke i form af loops og betingelser og variabler; tænk i stedet over, hvordan du beskriver de data, du ønsker. Den vanskelige del er, at du ønsker, at forespørgslen skal referere til sine egne resultater, og det er hvad rekursive CTE'er er til:
Du leder efter noget som dette:
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
Det vil give dig dette:
id | parent
----+--------
4 | 2
2 | 1
1 |
og så kan du sætte det sammen igen i en sti, der ville være mere linket-listet (eller hvad der nu er passende på dit klientsprog) uden for databasen. Du behøver ikke at inkludere parent
selvfølgelig, men at inkludere det vil hjælpe dig med at rette op på "pegerne".