繁体   English   中英

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

[英]Array field in postgres, need to do self-join with results

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

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

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

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

以下查询将查找与id 14的对象的子代对应的所有行:

SELECT *
FROM unnest((SELECT children FROM stuff WHERE id=14)) t(id)
     JOIN stuff USING (id)
ORDER BY score;

通过首先查找14的子级作为数组,然后使用unnest函数将其转换为表,然后与stuff以查找具有给定id的所有行,可以实现这一目的。

加入条件中的ANY构造将是最简单的:

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

对于查询而言,子ID的数组是在同一表中还是在另一表中都没有关系。 您只需在这里使用表别名即可明确。

有关:

类似的解决方案:

使用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查询,用于获取存储在单个表中的n级父子关系

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM