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

Rekurzivní CTE spojuje pole s rodiči z libovolného bodu

V shora dolů metoda počáteční dotaz by měl vybrat pouze kořeny (položky bez rodičů), takže dotaz vrátí každý řádek pouze jednou:

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

Pokud je vaším cílem najít konkrétní položku, zdola nahoru přístup je efektivnější:

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

Odstraňte podmínky final where v obou dotazech, abyste viděli rozdíl.

Otestujte to v rextesteru.




  1. JSON_UNQUOTE() – Odstranění nabídek z dokumentu JSON v MySQL

  2. Upgrade na nejnovější Jira s nejnovější verzí serveru MariaDB

  3. Operátor zřetězení řetězců v Oracle, Postgres a SQL Server

  4. CURRENT_DATE/CURDATE() nefunguje jako výchozí hodnota DATE