Fer*_*ães 5 postgresql tree hierarchy recursive-query hierarchical-data
我在PostgreSQL数据库上有下表(parent_fk是引用同一个表的外键):
id | parent_fk
72 |
342 | 72
583 | 342
Run Code Online (Sandbox Code Playgroud)
我想查询这个表,并通过中间父/子关系发现每个元素到最终父元素的路径.例如,我想获得以下作为SQL查询的答案:
id | parent_fk | path
72 | | 72
342 | 72 | 72;342
583 | 342 | 72;342;583
Run Code Online (Sandbox Code Playgroud)
我读过关于PostgreSQL的CTE(公用表表达式)和递归查询,但我自己还是无法解决这个问题.有任何想法吗?提前致谢.
Cra*_*ger 10
如果你做了很多这样的事情,你可能想要检查ltree
contrib模块.
这是一个可以完成工作的CTE,请参阅SQLFiddle:
WITH RECURSIVE x(id,parent_fk,parents,last_id, depth) AS (
SELECT id, parent_fk, 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, parent_fk, array_to_string(parents,';')
FROM x
WHERE depth = (SELECT max(sq.depth) FROM x sq WHERE sq.id = x.id);
Run Code Online (Sandbox Code Playgroud)
您的表是有向图的表示,作为一组边.您已指定图形是树,这意味着它是非循环的.您要做的是找到从树上的每个节点(内部或叶子)到根的路径,并将其表示为分号分隔的字符串.
归档时间: |
|
查看次数: |
2078 次 |
最近记录: |