我正在尝试创建一个postgres视图,其中包含一种层次结构的哈希映射。
我的层次结构表看起来像:
------------------
| id | parent_id |
------------------
| 1 | null |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
出于性能原因,我需要在程序代码中进行哈希重新定位
1 => [2,3,4]; 2 => [4]; ...
我可以通过此查询获得1的所有孩子:
WITH RECURSIVE
h_tree(id, label)
AS (
SELECT
id,
label
FROM hierarchy
WHERE parent_id = 10000
UNION ALL
(
SELECT
h.id,
h.label
FROM h_tree v, hierarchy h
WHERE h.parent_id = v.id
)
)
SELECT array_to_json(ARRAY_AGG(id)) AS children_ids
FROM h_tree
此查询为我提供了一个(json编码的)列表,其中包含" 10000"的所有子项。
我的问题:
如何在此查询输出为
的表单中包装它---------------------------------
| hierarchy_id | children_ids[] |
---------------------------------
| 1 | [2,3,4] |
非常感谢!
修改
我的问题出错了。我需要所有的后代,谢谢@pozsfor指出这一点。
此外我的例子有缺陷,我编辑了它。
答案 0 :(得分:2)
WITH RECURSIVE children AS
(SELECT parent_id AS id, id AS child_id
FROM hierarchy
WHERE parent_id IS NOT NULL
UNION
SELECT children.id, h.id
FROM children
JOIN hierarchy h
ON h.parent_id = children.child_id
)
SELECT hierarchy.id,
string_agg(children.child_id::text, ',')
FROM hierarchy
LEFT JOIN children USING (id)
GROUP BY hierarchy.id;
┌────┬────────────┐
│ id │ string_agg │
├────┼────────────┤
│ 1 │ 2,3,4 │
│ 2 │ 4 │
│ 3 │ │
│ 4 │ │
└────┴────────────┘
(4 rows)