sql >> Database >  >> RDS >> PostgreSQL

Recursieve CTE voegt velden samen met ouders vanuit een willekeurig punt

In de van boven naar beneden methode de initiële zoekopdracht moet alleen wortels selecteren (items zonder ouders), dus de zoekopdracht retourneert elke rij slechts één keer:

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

Als het uw doel is om een ​​specifiek item te vinden, kunt u de bottom-up aanpak is efficiënter:

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

Verwijder de definitieve waar-voorwaarden in beide zoekopdrachten om het verschil te zien.

Test het in rextester.




  1. Slaapstand + PostgreSQL + netwerkadrestype (inet, cdir)

  2. Geef de dag, maand en jaar terug in MySQL

  3. Controleer of een object een opgeslagen procedure is met behulp van OBJECTPROPERTY() in SQL Server

  4. Exporteer Postgresql-tabelgegevens met pgAdmin