postgresql – 生成从每个节点到树的根的路径,表示为表中的边
发布时间:2020-12-13 18:07:14 所属栏目:百科 来源:网络整理
导读:我在PostgreSQL数据库上有下表(parent_fk是引用同一个表的外键): id | parent_fk72 | 342 | 72583 | 342 我想查询这个表,并通过中间父/子关系发现每个元素到最终父元素的路径.例如,我想获得以下作为SQL查询的答案: id | parent_fk | path72 | | 72342 | 72
我在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); 您的表是有向图的表示,作为一组边.您已指定图形是树,这意味着它是非循环的.您要做的是找到从树上的每个节点(内部或叶子)到根的路径,并将其表示为分号分隔的字符串. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |