Ditt tänkande är fel för SQL. Tänk inte i termer av loopar och villkor och variabler; tänk istället på hur du ska beskriva den data du vill ha. Det knepiga är att du vill att frågan ska referera till sina egna resultat och det är vad rekursiva CTE är för:
Du letar efter något sånt här:
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 ger dig detta:
id | parent
----+--------
4 | 2
2 | 1
1 |
och sedan kan du sätta ihop det igen i en sökväg som skulle vara mer länkad (eller vad som är lämpligt på ditt klientspråk) utanför databasen. Du behöver inte inkludera parent
självklart men att inkludera det hjälper dig att fixa "pekarna".