POSTGRESQL множественный выбор, возможно несколько массивов строк?
Скажем, я делаю что-то простое, например, выбираю все из двух таблиц:
"SELECT * FROM table1; SELECT * FROM table2;"
Он вернет объект результатов, который выглядит следующим образом:
{rows:[{},{},{} etc...]}
Где массив объектов строки - каждая строка из table1
с последующим каждым рядом table2
,
То, что я хочу, - это уметь сочетать вышесказанное. SELECT
операторы в один запрос к БД, но они возвращают что-то вроде:
[
{table1rows:[{},{},{}]}
,{table2rows:[{},{},{}]}
]
... так что я могу избежать нескольких запросов к БД, а затем переписать объект результатов каждого запроса в пользовательский объект, на который я ссылаюсь из запроса БД на запрос БД, как пещерный человек. Итак, один запрос, один чистый набор результатов, которые я могу обработать на клиенте, зная, какой массив строк пришел из какой таблицы.
Вы можете использовать AS
за это? Как бы я достиг этого с помощью одного запроса?
1 ответ
Вам в основном нужно:
- использовать объединить несколько запросов с 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)