PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL :boucler jusqu'à ce qu'une condition soit vraie

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