Votre pensée est fausse pour SQL. Ne pensez pas en termes de boucles, de conditions et de variables; réfléchissez plutôt à la façon de décrire les données que vous voulez. La partie délicate est que vous voulez que la requête se réfère à ses propres résultats et c'est ce que CTE récursifs sont pour :
Vous recherchez quelque chose comme ceci :
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
Cela vous donnera ceci :
id | parent
----+--------
4 | 2
2 | 1
1 |
et ensuite vous pouvez remettre cela ensemble dans un chemin qui serait plus lié à la liste (ou tout ce qui est approprié dans la langue de votre client) en dehors de la base de données. Vous n'êtes pas obligé d'inclure parent
bien sûr, mais l'inclure vous aidera à corriger les "pointeurs".