在 postgresql 中添加一系列由 id 引用链接的单元格

Adding a sequence of cells chained by id reference in postgresql

我有一个包含 idnumber_of_foosparent_foo 列的 table foonumber_of_foos 是一个整数,parent_foo 是对另一行的 id 的引用。每行将在 parent_foonull 中有一个整数,如果它没有 parent.

id | number_of_foos | parent_foo
---+----------------+-----------
 1 |             10 |       null
 2 |             7  |       null
 3 |             6  |       null
 4 |             13 |          1
 5 |             9  |          3
 6 |             1  |          4

给定一个 id 数字,我想在 "foo chain" 中找到 "foo" 的总数,即该 ID 的 foos 计数及其 parent(及其 parent,及其 parent...)。例如,foos 的总量 WHEN id = 6 是 1 + 13 + 10 = 24.

好的。

BUT,我也想每个parent减1。所以 WHEN id = 6 实际上是 (1 + 13 + 10) - 2 = 22.

这可能吗?

demo: db<>fiddle

WITH RECURSIVE rec AS (
    SELECT 
        parent_foo,
        number_of_foos
    FROM foo
    WHERE id = 6

    UNION

    SELECT
        f.parent_foo,
        r.number_of_foos + f.number_of_foos - 1
    FROM foo f
    JOIN rec r ON f.id = r.parent_foo
)
SELECT number_of_foos 
FROM rec
WHERE parent_foo IS NULL;

使用 WITH RECURSIVE CTE 你可以 运行 通过你的数据结构。递归 CTE 由两部分组成:

  1. 起点:选择第一行。在您的情况下,第一个值的父级及其 number_of_foos 值。
  2. 递归部分,您 select 上次递归 id == parent_foo 的行。在此步骤中,您还可以集成添加部分:只需将新的 numbers_of_foo - 1 添加到最后一个

最后你可以给出没有任何父级的行,它是你的起始值的最大父级并且包含预期的总和。