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

Rekurzivní dotaz na hirarchická data na základě seznamu sousedství

Váš dotaz pro první úroveň (zde depth odlišit od tabulky) by měl vypadat takto:

select l.name, h.child_id, 1 as depth 
from level l
join level_hierarchy h on l.id = h.child_id 
where h.parent_id is null;

   name   | child_id | depth 
----------+----------+-------
 Level1_a |        1 |     1
(1 row)

Všimněte si, že správné použití is null (nepoužívejte = pro srovnání s null jako vždy dává null ).

Výše uvedené můžete použít jako počáteční dotaz v rekurzivním cte:

with recursive recursive_query as (
    select l.name, h.child_id, 1 as depth 
    from level l
    join level_hierarchy h on l.id = h.child_id 
    where h.parent_id is null
union all
    select l.name, h.child_id, depth + 1
    from level l
    join level_hierarchy h on l.id = h.child_id
    join recursive_query r on h.parent_id = r.child_id
)
select *
from recursive_query
-- where depth = 2

   name   | child_id | depth 
----------+----------+-------
 Level1_a |        1 |     1
 Level2_b |        3 |     2
 Level2_a |       19 |     2
 Level3_a |        4 |     3
 Level3_b |        5 |     3
 Level4_a |        6 |     4
 Level4_b |        7 |     4
(7 rows)    


  1. Rozdělte řetězec v Oracle pomocí regexp_substr v pořadí

  2. Databáze v databázi (návrh tabulky)

  3. Získejte údaje o cenách pro produkt, který lze rezervovat, s obdobími ve WooCommerce

  4. SET a Select Query kombinují Spuštění v jediném MySql dotazu a předají výsledek v pentaho