sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:Loop tills ett tillstånd är sant

Ditt tänkande är fel för SQL. Tänk inte i termer av loopar och villkor och variabler; tänk istället på hur du ska beskriva den data du vill ha. Det knepiga är att du vill att frågan ska referera till sina egna resultat och det är vad rekursiva CTE är för:

Du letar efter något sånt här:

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

Det ger dig detta:

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

och sedan kan du sätta ihop det igen i en sökväg som skulle vara mer länkad (eller vad som är lämpligt på ditt klientspråk) utanför databasen. Du behöver inte inkludera parent självklart men att inkludera det hjälper dig att fixa "pekarna".




  1. förhindra sql-injektion

  2. Återställ sekvensvärdet till 1

  3. JSON_LENGTH() – Returnera längden på ett JSON-dokument i MySQL

  4. Behöver ordna anställdas namn enligt deras stad kolumnvis