当前位置: 首页 > 知识库问答 >
问题:

R2DBC邻接列表获取所有子级

令狐宏浚
2023-03-14

我有一个表,它有idparentId列:我把这个结构称为邻接列表<所以,现在我想得到任意id的所有子项。这个问题的经典解决方案是使用递归,例如这里是Postgres过程或CTE实现。

我目前正在使用Spring Webflux和Spring Data R2DBC Postgres R2DBC驱动程序(它还不支持存储过程)<我如何以被动的方式处理这个问题?有没有可能,或者我遗漏了一些概念上的错误?

UPD 1:

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

现在,我想在ReactiveCrudRepository中有一个方法,它将返回所提供id的所有子级。

例如,使用示例html" target="_blank">数据:通过提供id='dir1',我希望获得id为:['dir1\u id1',“dir1\u dir1”,“dir1\u dir1\u id1”的子级。

共有2个答案

轩辕鸿祯
2023-03-14

我认为最好的sql方法是递归CTE(公共表表达式),您尝试过吗?我从来没有试过多排。

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\u id='dir1'的输出

景宏盛
2023-03-14

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

在您的案例场景中,您只需要使用递归cte,但在id、parentid上添加索引肯定会有所帮助

create index idx_name on tablename (parentid , id);

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

 类似资料:
  • 问题内容: 获取Oracle中所有表的列表? 问题答案: 假设您有权访问DBA_TABLES数据字典视图。如果您没有这些特权但需要它们,则可以请求DBA显式授予您对该表的特权,或者请求DBA授予您该SELECT ANY DICTIONARY特权或SELECT_CATALOG_ROLE角色(这两者都将允许您查询任何数据字典表) )。当然,您可能希望排除某些模式,例如SYS和模式,SYSTEM而这些模

  • 例如:如果数组是[9,8,7,6,5,4,3,1,2,2],它应该返回46(长度为7的子数组[9,8,7,6,5,4,3]和长度为2的子数组[2,2]之和)。不能组合[9,8,7,6,5,4,3]和[1,2,2],因为这将产生长度为10的非素数的连续子数组(幂等性)。 有谁能解释一下如何使用DP来解决这类问题吗?多谢了。

  • 功能说明 通过接口查询管理员列表,返回管理员信息. 接口说明 请求header GET http://{your-domain}/v1/account/managers Authorization:Bearer {ACCESS TOKEN} Content-Type:application/json 注: 请将上方的{ACCESS TOKEN}替换为您的ACCESS TOKEN 请将 {you

  • 我得到以下exeption连接到Mssql服务器。 我在属性中使用相同的配置连接到JDBC,但在尝试连接到R2DBC时出现问题。在Rest时发生,而不是在启动应用程序时发生。

  • 我有一个FutureBuilder(很高兴加载)从Firebase获取我的DocumentSnapshot列表,但问题是如果我推送/弹出屏幕,它会一遍又一遍地重建它。为了解决这个问题,我最终将它放在了上,但我有一个问题,我有时无法从中获取所有文档。 我有一个按钮可以启用国家/地区筛选和禁用,每次按下它几乎都会立即显示我的文档,例如,我总共筛选了11个国家/地区,筛选了5个国家/地区,但有时我不会全