簡體   English   中英

在Postgres中使用sum進行遞歸查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM