Arrays PostgreSQL并行运行查询

Arrays PostgreSQL并行运行查询,arrays,postgresql,window-functions,recursive-query,Arrays,Postgresql,Window Functions,Recursive Query,我正在尝试创建一个查询/视图,它对一组主题执行层次结构计算,并在3代内返回公共祖先。我已经成功地运行了一个单一的主题,在一个时间,并希望能够做到这一点,在一个完整的表。下面是相关的子查询,当执行时,它返回来自任何受试者兄弟姐妹的共同祖先返回父代,期望的结果是这将在每个受试者的共同祖先上运行一个近交个体。如何输入多个值,对各个值运行查询,然后检索追溯到原始输入的多个单独输出 WITH d1 AS ( WITH RECURSIVE nodes(sub, parentid, parentname

我正在尝试创建一个查询/视图,它对一组主题执行层次结构计算,并在3代内返回公共祖先。我已经成功地运行了一个单一的主题,在一个时间,并希望能够做到这一点,在一个完整的表。下面是相关的子查询,当执行时,它返回来自任何受试者兄弟姐妹的共同祖先返回父代,期望的结果是这将在每个受试者的共同祖先上运行一个近交个体。如何输入多个值,对各个值运行查询,然后检索追溯到原始输入的多个单独输出

WITH d1 AS (
   WITH RECURSIVE nodes(sub, parentid, parentname, childid, childname, path, depth) AS (
           SELECT cats.dbid AS sub,
              r.parentid,
              p1.subject,
              r.childid,
              p2.subject,
              ARRAY[r.parentid] AS "array",
              1
             FROM pedigree_search r,
              pedigree p1,
              pedigree p2,
              cats
            WHERE r.childid = cats.dbid AND p1.dbid = r.parentid AND p2.dbid = r.childid
          UNION ALL
           SELECT cats.dbid AS sub,
              r.parentid,
              p1.subject,
              r.childid,
              p2.subject,
              nd.path || r.parentid,
              nd.depth + 1
             FROM pedigree_search r,
              pedigree p1,
              pedigree p2,
              nodes nd,
              cats
            WHERE r.childid = nd.parentid AND p1.dbid = r.parentid AND p2.dbid = r.childid AND nd.depth < 3
   )
   SELECT nodes.sub,
      nodes.parentid,
      nodes.parentname,
      nodes.childid,
      nodes.childname,
      nodes.path,
      nodes.depth
     FROM nodes
)
SELECT d1.sub,
  d1.parentid,
  d1.parentname,
  d1.childid,
  d1.childname,
  d1.path,
  d1.depth
 FROM d1
WHERE (d1.parentid IN ( SELECT d1_1.parentid
         FROM d1 d1_1
        GROUP BY d1_1.parentid
       HAVING count(d1_1.parentid) > 1))

您的示例太复杂,无法遵循,但原则上看起来是这样的:

WITH RECURSIVE anc AS (
      SELECT seed.p AS child,
             r.parent AS ancestor,
             1 AS level
      FROM relation AS r
         JOIN (VALUES (42),
                      (12),
                      ...
              ) AS seed(p)
            ON r.child = seed.p
   UNION
      SELECT a.child,
             r.parent,
             a.level + 1
      FROM relation AS r
         JOIN anc AS a
            ON r.child = a.ancestor
      WHERE a.level < 3
)
SELECT * FROM anc;
根据您的特殊情况进行修改和调整