postgresql – 生成从每个节点到树的根的路径,表示为表中的边

postgresql – 生成从每个节点到树的根的路径,表示为表中的边,第1张

概述我在PostgreSQL数据库上有下表(parent_fk是引用同一个表的外键): id | parent_fk72 | 342 | 72583 | 342 我想查询这个表,并通过中间父/子关系发现每个元素到最终父元素的路径.例如,我想获得以下作为SQL查询的答案: id | parent_fk | path72 | 我在Postgresql数据库上有下表(parent_fk是引用同一个表的外键):
ID    |    parent_fk72    |    342   |    72583   |    342

我想查询这个表,并通过中间父/子关系发现每个元素到最终父元素的路径.例如,我想获得以下作为SQL查询的答案:

ID    |    parent_fk    |    path72    |                 |     72342   |    72           |    72;342583   |    342          |   72;342;583

我读过关于Postgresql的CTE(公用表表达式)和递归查询,但我自己还是无法解决这个问题.有任何想法吗?提前致谢.

如果你做了很多这样的事情,你可能想要检查 ltree contrib module.

这是一个CTE,它将完成这项工作,见SQLFiddle:

WITH RECURSIVE x(ID,parent_fk,parents,last_ID,depth) AS (  SELECT ID,ARRAY[ID] AS parents,ID AS last_ID,0 AS depth FROM table1  UNION ALL  SELECT x.ID,x.parent_fk,parents||t1.parent_fk,t1.parent_fk AS last_ID,x.depth + 1  FROM x     INNER JOIN table1 t1     ON (last_ID= t1.ID)  WHERE t1.parent_fk IS NOT NulL)SELECT ID,array_to_string(parents,';')FROM x WHERE depth = (SELECT max(sq.depth) FROM x sq WHERE sq.ID = x.ID);

您的表是有向图的表示,作为一组边.您已指定图形是树,这意味着它是非循环的.您要做的是找到从树上的每个节点(内部或叶子)到根的路径,并将其表示为分号分隔的字符串.

总结

以上是内存溢出为你收集整理的postgresql – 生成从每个节点到树的根的路径,表示为表中的边全部内容,希望文章能够帮你解决postgresql – 生成从每个节点到树的根的路径,表示为表中的边所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1181575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存