sql >> Database >  >> RDS >> PostgreSQL

Recursieve zoekopdracht voor hirarchische gegevens op basis van aangrenzende lijst

Uw vraag voor het eerste niveau (hier depth om te onderscheiden van de tabel) zou er als volgt uit moeten zien:

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)

Let op het juiste gebruik van is null (gebruik geen = om te vergelijken met null omdat het altijd null . geeft ).

U kunt het bovenstaande gebruiken als een eerste vraag in een recursieve 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. Hoe bewerk je een opgeslagen procedure in MySQL?

  2. Oracle- maak een tijdelijke resultatenset voor gebruik in een query

  3. Hoe een opname in een while-lus te krijgen

  4. Correcte manier om tussen de 5.000 en 100.000 waarden door te geven in de mysql WHERE-clausule