Toto je zjednodušená verze @a_horse's správné odpověď
(po diskuzi s OP v komentářích).
Funguje s jakýmikoli (přiměřeně konečný) počet úrovní v rekurzi.
Celková cena za dané 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;
Celková cena za všechny projekty
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 zde
(se správným testovacím případem)
Starý sqlfiddle