我需要创建一个SQL查询(postgres 9.5.3),它返回一个分层的JSON结果。这是我目前为止写的代码
WITH RECURSIVE q AS (
WITH c AS (
SELECT pc."Id", pc."Description"
FROM "ProductCategories" pc
WHERE pc."Active" = true
)
SELECT pc, ARRAY[c] as "Children", ARRAY[pc."Id"] as "Path"
FROM "ProductCategories" pc
LEFT JOIN c ON pc."Id" = c."Id"
WHERE NULLIF(pc."ParentId", 0) IS NULL
AND pc."Active" = true
UNION ALL
SELECT pc_descendant, array_append(q."Children", c), q."Path" || pc_descendant."Id"
FROM q
JOIN "ProductCategories" pc_descendant ON pc_descendant."ParentId" = (q.pc)."Id"
LEFT JOIN c ON pc_descendant."Id" = c."Id"
WHERE pc_descendant."Active" = true
)
SELECT * FROM q
我在创建层次对象Children
时遇到问题。对于这些结构
A
B
C
D
E
array_append
函数似乎将任何子元素附加到单个数组中:
A.Children = [ {B}, {C}, {D} ] //for category A
我需要结构:
A.Children = [ {B, Children = [ {C, Children = [ {D} ] } ] } ]
如何更改查询以实现此目的?问候
2条答案
按热度按时间9wbgstp71#
我不确定这是可能的,至少在简单方便的方式。
然而,使用“真正的”递归似乎很简单。
下面是一个简单的例子:
and结果
我希望你能适应你的数据。
祝你好运
0mkxixxg2#
我也遇到了同样的问题,但是是整排的。在解决这个问题时,我发现了一个优化版本的想法:
测试结果: