0

“内容”表有一个列“ltree” - 内容项是使用基于此 ltree 的层次结构创建的。

例如:

标题 长树
记录 1 1
记录 2 1.2
记录 3 1.2.3

我正在尝试做的是创建一个 SELECT 语句,在该语句中我收到记录子项的嵌套响应:

标题 孩子们
记录 1 {记录 2,{记录 3,{}}}

目标是检索不同数量的“顶级”记录,以及通过 LTREE 分配给该顶级记录的嵌套子项

我尝试过:

SELECT DISTINCT title, ARRAY(SELECT title FROM content t WHERE t.ltree <@ content.ltree At.ltree != content.ltree) as children

这将为我提供

标题 孩子们
记录 1 {记录 2}
记录 2 {记录 3}
记录 3 {}

但是,这只会为我提供“1 层深”的响应,我还没有找到一种方法来继续嵌套响应 - 如果可能的话 - 然后从上面的选择中删除记录 2 和记录 3它存在于嵌套记录之一中。

任何建议都非常感谢 - 当谈到 psql/sql 时,我并不完全在我的元素中。

4

1 回答 1

1

您可以使用ARRAY_AGG函数从当前节点聚合一组继承:

select t.title, (select array_agg(p.ltree) from content p where p.ltree <@ t.ltree) from content t;

这将为您提供树的当前和所有子节点,如下所示:

标题 array_agg
记录 1 {1,1.2,1.2.3}
记录 2 {1.2,1.2.3}
记录 3 {1.2.3}

由于这是一个树结构,嵌套有点违反常识,因为树实际上是一个嵌套结构。如果您想嵌套行,我会冒着风险说您最终会使用某种存储过程,因为它需要多级子选择。可以尝试分层查询,但目前这是一项有点复杂的任务。

于 2021-04-03T03:23:39.980 回答