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)
Другие вопросы по тегам