我把我的问题过于简单化了。
我有一个表格,格式如下:
| 身份证|父代标识|姓名|
| - ------|- ------|- ------|
| 1个|[无效]|识别码1|
| 第二章|1个|身份2|
| 三个|第二章|aa3|
| 四个|三个|第四期|
| 五个|第二章|美国广播公司|
| 六个|[无效]|ABC1|
我想检索,在SQL中理想的路径根-(即,节点与parent_id = null)例如:
getPath(5) -> "id1 / id2 / abc"
getPath(4) -> "id1 / id2 / aa3 / bb4"
getPath(6) -> "abc1"
我已经构建了一个python函数来构造path-while循环,当parent_id为null时,while循环会中断,并在字符串的开头插入名称,但我希望有一种方法可以通过单个DB操作来解决这个问题,而不是多次选择。
有什么建议可以帮助你找到解决方案吗?
非常感谢!
4条答案
按热度按时间s3fp2yjn1#
根据你所要做的事情,你无疑可以改进这一点。例如,也许你想把路径作为一个数组。
请注意,在从sqlite3到IBM db2的大多数现代数据库中也可以使用非常类似的方法-请参阅您的本地文档。
比如:
现在,让我们填充一些值:
要查询:
您至少需要
id
和parent_id
上的索引。kwvwclae2#
您可以使用带有
concat
的recursive
查询来完成此操作,只需在externwhere子句中传递id
以获取路径Demo here
wbgh16ku3#
下面的查询由一个函数组成,该函数包含用于生成路径的递归
cte
。然后可以根据示例调用该函数,以在脚本的其他位置生成路径:用法:
See fiddle
piok6c0g4#
如果您正在检索另一个结果集中返回的每个id的路径,则直接联接到递归CTE会更有意义,该CTE是以层次结构的根节点为种子的。
当为一个特定的节点获取/构建路径时,从根节点开始构建整个树是没有意义的,我们应该从指定的节点开始,沿着树向上走:
或 Package 在函数中:
用法:
这是一个db<>fiddle