Đây là phiên bản đơn giản của @ a_horse's đúng câu trả lời
(sau khi thảo luận với OP trong phần nhận xét).
Làm việc với bất kỳ (hữu hạn hợp lý) số cấp trong đệ quy.
Tổng giá cho project_id
đã cho
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;
Tổng giá cho tất cả các dự án
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;
db <> fiddle tại đây
(với trường hợp thử nghiệm chính xác)
sqlfiddle
cũ