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

Sådan krydser du en hierarkisk træstruktur baglæns ved hjælp af rekursive forespørgsler

OPDATERING 2: Jeg omskrev den oprindelige rekursive forespørgsel, så al akkumulering/aggregering sker uden for den rekursive del. Det burde fungere bedre end den tidligere version af dette svar. Dette er meget ens svaret fra @a_horse_with_no_name for et lignende spørgsmål.

WITH RECURSIVE search_graph(edge, from_node, to_node, length, area, start_node) AS ( SELECT edge, from_node, to_node, length, area, from_node AS "start_node" FROM tree UNION ALL SELECT o.edge, o.from_node, o.to_node, o.length, o.area, p.start_node FROM tree o JOIN search_graph p ON p.from_node = o.to_node ) SELECT array_agg(edge) AS "edges" -- ,array_agg(from_node) AS "nodes" ,count(edge) AS "edge_count" ,sum(length) AS "length_sum" ,sum(area) AS "area_sum" FROM search_graph GROUP BY start_node ORDER BY start_node ;

Resultaterne er som forventet:

start_node | edges | edge_count | length_sum | area_sum ------------+-------------+------------+------------+------------ 1 | {A} | 1 | 1.1 | 0.9 2 | {B} | 1 | 1.2 | 1.3 3 | {C} | 1 | 1.8 | 2.4 4 | {D,B,A} | 3 | 3.5 | 3.5 5 | {E,D,C,B,A} | 5 | 6.4 | 6.8


  1. VÆLG SUM() med betingelser i mysql

  2. forespørgsel efter postgres db med node-postgres

  3. Sådan overføres tabelværdiparametre til lagret procedure fra .net-kode

  4. Skal jeg indeksere primærnøglekolonne(r) i Oracle