PostgreSQL – 返回多个任意子查询的结果

像问题的标题所示,我试图采取一些任意的子查询,并将它们组合成一个单一的大型查询。

理想情况下,我想将数据作为单个logging返回,每列是其中一个子查询的结果。 例如

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

子查询本身是在Node应用程序中使用Knex.js构build的,完全是任意的。 我已经相当接近一个适当的解决scheme,但我遇到了一个障碍。

我目前的实现有这样的最后一个查询:

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

其中大部分工作,但在输出中导致大量的重复。 在我的testing过程中,我发现它会返回logging,这样每个logging的重复次数就等于没有重复logging的情况下将返回多lesslogging。 例如,应该返回10个logging的子查询将返回100(每个logging被重复10次)。

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

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

  • 单独查询时,子查询返回的logging数是正确的
  • 副本不是由子查询之间的交集造成的
    • 即子查询包含其他子查询中存在的行

提前致谢。

只要将任意查询放在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)