[英]Recursive query with sum in Postgres
我必須在我的數據庫中存儲很多項目。 每個項目都可以有子項目。 結構看起來像一棵樹:
Project
/ | \
ProjectChild1 ProjectChild2 [...] ProjectChild[n]
/ |
ProjectChildOfChild1 ProjectChildOfChild2
樹的層次是未知的。 我正在考慮創建一個這樣的表:
表Projects
:
project_ID id_unique PRIMARY_KEY
project_NAME text
project_VALUE numeric
project_PARENT id_unique
在這種情況下,列project_PARENT
將存儲父項目的id(如果存在)。
對於我的應用程序,我需要檢索項目的總值,為此我需要總結每個項目子項和根項目的值。
我知道我需要使用遞歸,但我不知道如何在Postgres中這樣做。
這是@ a_horse 正確答案的簡化版本(在評論中與OP討論后)。
適用於遞歸中任何 (合理有限的)級別。
project_id
總價格 WITH RECURSIVE cte AS (
SELECT project_id AS project_parent, project_value
FROM projects
WHERE project_id = 1 -- enter id of the base project here !
UNION ALL
SELECT p.project_id, p.project_value
FROM cte
JOIN projects p USING (project_parent)
)
SELECT sum(project_value) AS total_value
FROM cte;
要一次性獲得所有項目的總成本:
WITH RECURSIVE cte AS (
SELECT project_id, project_id AS project_parent, project_value
FROM projects
WHERE project_parent IS NULL -- all base projects
UNION ALL
SELECT c.project_id, p.project_id, p.project_value
FROM cte c
JOIN projects p USING (project_parent)
)
SELECT project_id, sum(project_value) AS total_value
FROM cte
GROUP BY 1
ORDER BY 1;
SQL Fiddle (帶有正確的測試用例)。
像這樣的東西:
with recursive project_tree as (
select project_id,
project_name,
project_value,
project_parent
from projects
where project_id = 42 -- << the id of the "base" project
union all
select p.project_id,
p.project_name,
p.project_value,
p.project_parent
from projects p
join project_tree t on t.project_id = p.project_parent
)
select sum(project_value)
from project_tree;
聯合的第一部分需要選擇要評估的項目(“子”項目)。 遞歸連接將向上遍歷樹並檢索所有父項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.