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

CTE récursif concatène les champs avec les parents à partir d'un point arbitraire

Dans le descendant méthode, la requête initiale ne doit sélectionner que les racines (éléments sans parents), de sorte que la requête ne renvoie chaque ligne qu'une seule fois :

with recursive top_down as (
    select id, parent, text
    from test
    where parent is null
union all
    select t.id, t.parent, concat_ws('/', r.text, t.text)
    from test t
    join top_down r on t.parent = r.id
)
select id, text
from top_down
where id = 4    -- input

Si votre objectif est de trouver un élément spécifique, la méthode ascendante approche est plus efficace :

with recursive bottom_up as (
    select id, parent, text
    from test
    where id = 4    -- input
union all
    select r.id, t.parent, concat_ws('/', t.text, r.text)
    from test t
    join bottom_up r on r.parent = t.id
)
select id, text
from bottom_up
where parent is null

Supprimez les conditions finales where dans les deux requêtes pour voir la différence.

Testez-le dans rextester.