sql >> Database teknologi >  >> RDS >> PostgreSQL

Rekursiv forespørgsel efter hirarkiske data baseret på tilgrænsende liste

Din forespørgsel til det første niveau (her depth for at skelne fra tabellen) skal se sådan ud:

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)
 

Bemærk den korrekte brug af is null (brug ikke = at sammenligne med null da det altid giver null ).

Du kan bruge ovenstående som en indledende forespørgsel i en rekursiv 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. Min doktrin er virkelig langsom. Enkel forespørgsel og et sekund for at få resultatet

  2. Transaktion inde i en plpgsql-funktion

  3. ASP.NET MVC 4, flere modeller i én visning?

  4. Transaktionsstyring med DAO'er