3

假设我正在做一些简单的事情,比如从两个表中选择所有内容:

"SELECT * FROM table1; SELECT * FROM table2;"

它将返回一个结果对象,如下所示:

{rows:[{},{},{} etc...]}

其中行对象数组是来自 的每一行table1,然后是来自 的每一行table2

我想要的是能够将上述SELECT语句组合成一个数据库查询,但让它返回如下内容:

[
{table1rows:[{},{},{}]}
,{table2rows:[{},{},{}]}
]

...这样我就可以避免数据库的多个查询,同时将每个查询的结果对象伪造为一个自定义对象,我从数据库查询引用到数据库查询,就像一个穴居人。所以一个查询,一个干净的结果集我可以在客户端处理,知道哪些行数组来自哪个表。

你能用AS这个吗?我将如何通过一个查询来实现这一目标?

4

1 回答 1

1

您基本上需要:
-将多个查询UNION ALL;结合使用 - 使用和函数
构建json数组 ;json_build_objectjson_agg

示例SELECT如下:

WITH table1(a1,b1) AS ( VALUES
  ('valA1','valB1')
), table2(a2,b2) AS ( VALUES
  ('valA2','valB2')
)
SELECT json_agg(each_table_rows.data) FROM (
  SELECT json_build_object('table1rows',tbl1.*) AS data
  FROM (
    SELECT t1.* FROM table1 t1
  ) tbl1
  UNION ALL
  SELECT json_build_object('table2rows',tbl2.*)
  FROM (
    SELECT t2.* FROM table2 t2
  ) tbl2
) each_table_rows;

结果:

                                           json_agg                                           
----------------------------------------------------------------------------------------------
 [{"table1rows" : {"a1":"valA1","b1":"valB1"}}, {"table2rows" : {"a2":"valA2","b2":"valB2"}}]
(1 row)
于 2016-01-09T13:34:32.727 回答