2016-01-09 19 views
2

说我正在做一些简单的像来自两个表中选择的一切:POSTGRESQL多选,多行数组可能?

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

它会返回一个结果对象,看起来像:

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

当行对象的数组中的每一行从table1,随后从table2每一行。

我想要的是能够将上述SELECT报表合并成一个数据库查询,但有它返回类似:

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

...让我能避免DB的多个查询时则捏造每个查询的结果将对象从我DB查询参考DB查询像穴居人的自定义对象。所以,一个查询,一个干净的结果集,我可以在客户端知道行的其中阵列处理来自哪个表来。

你可以使用AS这个?如何用一个查询来实现这一点?

+1

可以使用'UNION ALL'的结果组合两个选择的。但是从两张表格中选择每一列和每行并不是一个好主意。 –

+0

我不会选择在现实中,所有的行,但为了便于阅读,我离开的那部分...... – OliverJ90

+0

你也离开了它的食物链格式输出JSON阵列的部分,因为Postgres没有做到这一点一个普通的'SELECT'。你可以让Postgres输出JSON,但是那时你的一个未命名的软件将嵌套它。 –

回答

1

你基本上需要:
- 使用combine multiple queriesUNION 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)