我有一个Postgres数据库这样的带桌子IDS:找到所有后代递归CTE
id INT PRIMARY KEY,
value TEXT,
parent_id INT REFERENCES ids DEFAULT NULL
我想找到的后代数量在此表中的所有行。因此,对于在树子树的大小叶子都将是1
我想用递归CTE做到这一点,写了:
WITH RECURSIVE r AS (
SELECT id, parent_id
from keyword
where id=1
UNION
SELECT k.id, k.parent_id
FROM keyword k
join r on k.parent_id = r.id)
select count(*) from r;
我只可以依靠某个ID的后裔,并不适用于所有。我尝试在CTE中按id编写组,但它不起作用(大部分时间它都会给所有顶点的子树大小等于1)。
基于此表,
id | parent_id | value
----+-----------+--------
1 | | SELECT
2 | 1 | FROM
3 | 1 | WHERE
4 | 1 | ORDER
5 | 4 | BY
6 | 1 | GROUP
7 | 6 | BY
8 | 6 | HAVING
11 | | UPDATE
12 | 11 | SET
13 | 11 | WHERE
我希望得到的是:
id | subtree_size
-------+----------
1 | 11
2 | 1
6 | 3...
而对于所有的id,它们在树上。
所有的树:以所有根开始:'where id = 1' - >>'parent_id IS NULL'您可以在外部查询中保留根结果和组。 – joop
更正:id = 1的subtree_size为8.({11,12,13}位于单独的树中) – joop