赞助商

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

发布时间:2019-05-15 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了postgresql – 生成从每个节点到树的根的路径,表示为表中的边脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在PostgreSQL数据库上有下表(parent_fk是引用同一个表的外键):
id    |    parent_fk
72    |    
342   |    72
583   |    342

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

id    |    parent_fk    |    path
72    |                 |     72
342   |    72           |    72;342
583   |    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 – 生成从每个节点到树的根的路径,表示为表中的边所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:76874919,请注明来意。
标签: