Seu pensamento está errado para SQL. Não pense em termos de loops, condições e variáveis; em vez disso, pense em como descrever os dados desejados. A parte complicada é que você quer que a consulta se refira aos seus próprios resultados e é isso que CTEs recursivos são para:
Você está procurando algo assim:
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
Isso vai te dar isso:
id | parent
----+--------
4 | 2
2 | 1
1 |
e, em seguida, você pode colocar isso de volta em um caminho que seria mais vinculado à lista (ou o que for apropriado no idioma do cliente) fora do banco de dados. Você não precisa incluir
parent
é claro, mas incluí-lo irá ajudá-lo a corrigir os "ponteiros".