sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:Smyčka, dokud není podmínka pravdivá

Vaše uvažování je pro SQL špatné. Nemyslete na smyčky, podmínky a proměnné; místo toho přemýšlejte o tom, jak popsat požadovaná data. Záludná část je, že chcete, aby dotaz odkazoval na své vlastní výsledky, a to je to, co rekurzivní CTE jsou pro:

Hledáte něco takového:

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

To vám dá toto:

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

a pak to můžete dát dohromady do cesty, která by byla více propojená (nebo cokoli, co je vhodné pro váš klientský jazyk) mimo databázi. Nemusíte uvádět parent samozřejmě, ale jeho zahrnutí vám pomůže opravit "ukazatele".




  1. Jak použít If Then Else v dotazu na aktualizaci MySQL?

  2. systém opakovaného vyúčtování

  3. Laravel Homestead SQLSTATE[HY000] [2002] Připojení odmítnuto po přesunutí serveru

  4. Postgres nepoužívá index na celočíselném poli, pokud je nainstalováno rozšíření intarray