PostgreSQL - 返回多个任意 sub-queries 的结果

PostgreSQL - Returning the results of multiple arbitrary sub-queries

就像问题的标题所暗示的那样,我正在尝试取一些任意的 sub-queries 并将它们组合成一个大的查询。

理想情况下,我希望将数据 return 编辑为单个记录,每一列都是 sub-queries 之一的结果。例如

|   sub-query 1   |   sub-query 2   |      ...
|-----------------|-----------------|-----------------
| (array of rows) | (array of rows) |      ...

sub-queries 本身是在 Node 应用程序中使用 Knex.js 构建的,并且完全是任意的。我已经非常接近正确的解决方案,但遇到了障碍。

我当前的实现有这样的最终查询:

SELECT
  array_agg(sub0.*) as s0,
  array_agg(sub1.*) as s1,
  ...
FROM
  (...) as sub0,
  (...) as sub1,
  ...
;

这大部分都有效,但会导致输出中出现大量重复项。在我的测试过程中,我发现它 returns 条记录,这样每条记录被复制的次数等于 return 没有重复的记录数。例如,应该 return 10 条记录的 sub-query 将改为 return 100(每条记录重复 10 次)。

我还没有弄清楚为什么会发生这种情况,也不知道如何解决查询问题。

到目前为止,我只能确定:

提前致谢。

只需将任意查询放在 select 列表中:

with sq1 as (
    values (1, 'x'),(2, 'y')
), sq2 as (
    values ('a', 3), ('b', 4), ('c', 5)
)
select
    (select array_agg(s.*) from (select * from sq1) s) as s0,
    (select array_agg(s.*) from (select * from sq2) s) as s1
;
        s0         |            s1             
-------------------+---------------------------
 {"(1,x)","(2,y)"} | {"(a,3)","(b,4)","(c,5)"}

您还可以将 row_number 添加到子查询并将该列用于外连接表(而不是交叉连接):

SELECT
  array_agg(sub0.*) as s0,
  array_agg(sub1.*) as s1
FROM
  (SELECT row_number() OVER (), * FROM (VALUES (1, 'x'),(2, 'y')) t) as sub0
  FULL OUTER JOIN
  (SELECT row_number() OVER (), * FROM (VALUES ('a', 3), ('b', 4), ('c', 5)) t1) as sub1
  ON sub0.row_number=sub1.row_number
;

             s0             |               s1                
----------------------------+---------------------------------
 {"(1,1,x)","(2,2,y)",NULL} | {"(1,a,3)","(2,b,4)","(3,c,5)"}
(1 row)