【问题标题】:Recursive query based on array column基于数组列的递归查询
【发布时间】:2021-07-18 22:25:02
【问题描述】:

我有一个表,以父项和子项作为列,我的父列是一个数组,因为子项可以有多个父项。那么任何人都可以建议如何构建cte(Postgres 11.2)来获取孩子的父母和祖先。这是我的数据。无论数组位置如何,cte 都应返回正确的父级。

CREATE TABLE public.mytable (
    id uuid NOT NULL,
    parent_id uuid[],
    name character varying(255) COLLATE pg_catalog."default",
    created_at timestamp with time zone NOT NULL,
    updated_at timestamp with time zone NOT NULL,
    CONSTRAINT mytable_pkey PRIMARY KEY (id)
);

数据是

id       parentId  

1        null      
2        null      
3        1         
4        1         
5        1         
6        [3,4]     
7        2         
8        6         

id=8 的预期输出:

parent

 1
 [3+4]
 6

【问题讨论】:

  • “父母”还是“父母”?请准确。披露您的 Postgres 版本、准确的表定义和准确的预期结果。
  • @ErwinBrandstetter 好的,添加了详细信息
  • @user8532998 你能添加一个更好的样本吗?您的表需要uuiduuid[],而您的数据样本使用intint[]。最好在您提到的表中添加INSERT 语句。

标签: sql arrays postgresql common-table-expression recursive-query


【解决方案1】:

这适用于您的测试用例:

WITH RECURSIVE ancestry AS (
   SELECT parent_id
   FROM   tbl
   WHERE  id = 8   -- your id here
   
   UNION ALL
   SELECT DISTINCT t.parent_id
   FROM   ancestry a
   JOIN   tbl t ON t.id = ANY (a.parent_id)
   WHERE  t.parent_id IS NOT NULL
   )
TABLE ancestry;

db小提琴here

但是,查询不会在同一级别上合并多个不同数组的元素。您的测试用例在这方面没有透露。你可能需要做更多的事情。但您首先必须准确定义数据中允许的内容以及如何处理同一级别的多个祖先数组中的重复项。

【讨论】:

  • 你是对的,下一个无赖是同一级别中具有不同父级的元素,当 3 和 4 来自不同的父级而不是 1 时就是这种情况。在这种情况下,我该如何分组最后一个祖先级别作为一个记录。
  • @user8532998:如果您需要更多建议,请改进问题。
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2021-11-01
相关资源
最近更新 更多