PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:Schleife, bis eine Bedingung wahr ist

Ihr Denken ist falsch für SQL. Denken Sie nicht in Schleifen, Bedingungen und Variablen; Denken Sie stattdessen darüber nach, wie Sie die gewünschten Daten beschreiben. Der knifflige Teil ist, dass Sie möchten, dass die Abfrage auf ihre eigenen Ergebnisse verweist, und das ist es, was rekursive CTEs sind für:

Sie suchen nach etwas in der Art:

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

Das wird Ihnen Folgendes geben:

 id | parent 
----+--------
  4 |      2
  2 |      1
  1 |       

und dann können Sie das in einem Pfad wieder zusammensetzen, der außerhalb der Datenbank mehr Linked-Listy (oder was auch immer in Ihrer Client-Sprache angemessen ist) wäre. Sie müssen parent nicht einschließen natürlich, aber das Einfügen wird Ihnen helfen, die "Hinweise" zu korrigieren.