अद्यतन 2: मैं मूल पुनरावर्ती क्वेरी को फिर से लिखता हूं ताकि सभी संचय/एकत्रीकरण पुनरावर्ती भाग के बाहर किया जा सके। इसे इस उत्तर के पिछले संस्करण की तुलना में बेहतर प्रदर्शन करना चाहिए। यह बहुत हद तक answer जैसा है। इसी तरह के प्रश्न के लिए @a_horse_with_no_name से।
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
;
परिणाम अपेक्षित हैं:
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