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