PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL:Loop até que uma condição seja verdadeira


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".