说我做了一些简单的事情,比如从两个表中选择所有内容:
"SELECT * FROM table1; SELECT * FROM table2;"
它将返回一个看起来像的结果对象:
{rows:[{},{},{} etc...]}
行对象数组是table1
的每一行,后面是table2
的每一行。
我想要的是能够将上述SELECT
语句组合到一个数据库查询中,但让它返回如下内容:
[
{table1rows:[{},{},{}]}
,{table2rows:[{},{},{}]}
]
...这样我就可以避免DB的多次查询,然后将每个查询的结果对象捏造成一个自定义对象,我从DB查询引用到DB查询就像一个穴居人。所以一个查询,一个干净的结果集,我可以在客户端知道哪个行来自哪个表。
你可以使用AS
吗?如何通过一个查询实现这一目标?
答案 0 :(得分:1)
你基本上需要:
- 将{strong> combine multiple queries 与UNION ALL
一起使用;
- 使用json_build_object
和json
函数构建json_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)