在 postgresql 中添加一系列由 id 引用链接的单元格
Adding a sequence of cells chained by id reference in postgresql
我有一个包含 id
、number_of_foos
和 parent_foo
列的 table foo
。 number_of_foos
是一个整数,parent_foo
是对另一行的 id
的引用。每行将在 parent_foo
或 null
中有一个整数,如果它没有 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.
这可能吗?
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 由两部分组成:
- 起点:选择第一行。在您的情况下,第一个值的父级及其
number_of_foos
值。
- 递归部分,您 select 上次递归
id == parent_foo
的行。在此步骤中,您还可以集成添加部分:只需将新的 numbers_of_foo - 1
添加到最后一个
最后你可以给出没有任何父级的行,它是你的起始值的最大父级并且包含预期的总和。
我有一个包含 id
、number_of_foos
和 parent_foo
列的 table foo
。 number_of_foos
是一个整数,parent_foo
是对另一行的 id
的引用。每行将在 parent_foo
或 null
中有一个整数,如果它没有 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.
这可能吗?
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 由两部分组成:
- 起点:选择第一行。在您的情况下,第一个值的父级及其
number_of_foos
值。 - 递归部分,您 select 上次递归
id == parent_foo
的行。在此步骤中,您还可以集成添加部分:只需将新的numbers_of_foo - 1
添加到最后一个
最后你可以给出没有任何父级的行,它是你的起始值的最大父级并且包含预期的总和。