【问题标题】:Array field in postgres, need to do self-join with resultspostgres中的数组字段,需要与结果进行自连接
【发布时间】:2017-01-25 07:14:20
【问题描述】:

我有一张如下所示的表格:

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

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

对最好的方法有什么建议吗?我已经研究了 WITH RECURSIVE 但我不确定这是否可行。尝试在 postgresql SE 上发帖,但没有成功。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

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

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

    首先将 14 的子元素作为数组查找,然后我们使用 unnest 函数将其转换为表,然后与 stuff 连接以查找具有给定 ids 的所有行。

    【讨论】:

    • 完美!谢谢@redneb
    【解决方案2】:

    类似的解决方案:

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

    递归 rel_tree 为 ( 选择 rel_id, rel_name, rel_parent, 1 作为级别,array[rel_id] 作为 path_info 从关系 其中 rel_parent 为空 联合所有 选择 c.rel_id, rpad(' ', p.level * 2) || c.rel_name, c.rel_parent, p.level + 1, p.path_info||c.rel_id 从关系 c 在 c.rel_parent = p.rel_id 上加入 rel_tree p ) 选择 rel_id, rel_name 来自 rel_tree 按路径信息排序;

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

    【讨论】:

      【解决方案3】:

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

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

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

      相关:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        相关资源
        最近更新 更多