postgres中的数组字段,需要与结果进行自联接

时间:2016-09-17 01:14:35

标签: sql postgresql

我有一个看起来像这样的表:

stuff
    id integer
    content text
    score double
    children[] (an array of id's from this same table)

我想运行一个查询,选择给定ID的所有子项,然后立即获取所有这些子项的完整行,按分数排序。

有关最佳方法的任何建议吗?我已经研究过RECURSIVE,但我不确定它是否可行。尝试在postgresql SE发帖但没有运气。

3 个答案:

答案 0 :(得分:3)

以下查询将查找与id 14:

对象的子项对应的所有行
SELECT *
FROM unnest((SELECT children FROM stuff WHERE id=14)) t(id)
     JOIN stuff USING (id)
ORDER BY score;

这可以通过首先找到14的子节点作为数组,然后使用unnest函数将其转换为表格,然后我们与stuff一起查找具有给定{{1}的所有行1}} S上。

答案 1 :(得分:1)

连接条件中的ANY构造最简单:

SELECT c.*
FROM   stuff p
JOIN   stuff c ON id = ANY (p.children)
WHERE  p.id = 14
ORDER  BY c.score;

对于查询,子ID数组是在同一个表中还是在不同的表中无关紧要。你只需要这里的表别名是明确的。

相关:

答案 2 :(得分:0)

类似的解决方案:

使用Postgres,您可以使用递归公用表表达式:

with recursive rel_tree as (
   select rel_id, rel_name, rel_parent, 1 as level, array[rel_id] as path_info
   from relations 
   where rel_parent is null
   union all
   select c.rel_id, rpad(' ', p.level * 2) || c.rel_name, c.rel_parent, p.level + 1, p.path_info||c.rel_id
   from relations c
     join rel_tree p on c.rel_parent = p.rel_id
)
select rel_id, rel_name
from rel_tree
order by path_info;

参考:Postgresql query for getting n-level parent-child relation stored in a single table