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 次)。
我还没有弄清楚为什么会发生这种情况,也不知道如何解决查询问题。
到目前为止,我只能确定:
- returnsub-queries编辑的记录数单独查询是正确的
- 重复不是由 sub-queries 之间的交集引起的
- 即sub-queries 包含存在于其他 sub-queries
中的行
提前致谢。
只需将任意查询放在 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)
就像问题的标题所暗示的那样,我正在尝试取一些任意的 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 次)。
我还没有弄清楚为什么会发生这种情况,也不知道如何解决查询问题。
到目前为止,我只能确定:
- returnsub-queries编辑的记录数单独查询是正确的
- 重复不是由 sub-queries 之间的交集引起的
- 即sub-queries 包含存在于其他 sub-queries 中的行
提前致谢。
只需将任意查询放在 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)