2016-01-09 2 views
2

Скажи, что я делаю что-то простое, как выбрать все из двух таблиц:Возможны множественные выборки POSTGRESQL, массивы с несколькими строками?

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

Он возвращает объект результатов, который выглядит как:

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

Где массив объектов строк является каждая строка из table1, за которым следует каждая строка от table2.

То, что я хочу, чтобы иметь возможность объединить вышеуказанные SELECT заявления в один DB запрос, но это вернуть что-то вроде:

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

... так что я могу избежать многочисленных запросов к БД, а затем fudging каждый объект результатов запроса в пользовательский объект. Я ссылаюсь на запрос БД на запрос БД, как пещерный человек. Таким образом, один запрос, один чистый набор результатов, который я могу обработать на клиенте, зная, какой массив строк пришел из этой таблицы.

Вы можете использовать AS для этого? Как я могу достичь этого с помощью одного запроса?

+1

Вы можете использовать 'СОЕДИНЕНИЕ ALL' для объединения результатов двух выбирает. Но выбор каждого столбца и строки из двух таблиц не похож на хорошую идею. –

+0

Я не собираюсь выбирать все строки в реальности, но для удобства чтения я оставил эту часть ... – OliverJ90

+0

Вы также оставили вне, какая часть пищевой цепи форматирует выход как массив JSON, потому что Postgres этого не делает для простого 'SELECT'. Вы можете сделать Postgres вывод JSON, но тогда ваше неназванное программное обеспечение будет гнездиться в другое время. –

ответ

1

Вы в основном нужно:
- использовать combine multiple queries с UNION ALL;
- сборка json массив с json_build_object и 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) 
Смежные вопросы