R2DBC邻接表获取全部children

R2DBC adjacency list get all children

我有一个 table,其中有 idparentId 列:我将此结构称为邻接列表。
所以,现在我想获得所有 children 的任意 id。这个问题的经典解决方案使用递归,例如 here is Postgres procedure or CTE implementation.

我目前正在使用 Spring Webflux 和 Spring Data R2DBC + Postgres R2DBC 驱动程序(尚不支持存储过程)。
我怎样才能以反应式的方式解决这个问题?甚至有可能还是我遗漏了概念上的错误?

更新 1:
让我们想象一下我们有这样的数据:

+-------------+---------+
|id           |parent_id|
+-------------+---------+
|root         |NULL     |
|id1          |root     |
|dir1         |root     |
|dir1_id1     |dir1     |
|dir1_dir1    |dir1     |
|dir1_dir1_id1|dir1_dir1|
+-------------+---------+

现在我想在 ReactiveCrudRepository 中使用一个方法,它将 return 所有 children 提供的 id。

例如,使用示例数据:通过提供 id='dir1',我想获得 ID 为 children 的 ['dir1_id1'、“dir1_dir1”、“ dir1_dir1_id1"].

我认为最好的 sql 方法是递归 CTE(通用 Table 表达式),您试过了吗?我从来没有尝试过很多行。

WITH recursive nodes AS (
   SELECT id, parent_id
   FROM t
   WHERE parent_id = 'dir1'
   
   UNION ALL
   
   SELECT t.id, t.parent_id
   FROM nodes n
   INNER JOIN t ON t.parent_id = n.id
)

SELECT id 
FROM nodes;

parent_id 的输出 = 'dir1'

id
dir1_id1
dir1_dir1
dir1_dir1_id1

使用 proc 或 cte 与全扫描无关。

在你的情况下,你只需要使用递归 cte ,但在 id 上添加索引,parentid 肯定会有所帮助

create index idx_name on tablename (parentid , id);

10k 行也没有那么大,索引肯定会大大提高 cte。