Как объединить список таблиц, полученных из другой таблицы одним запросом? - PullRequest
2 голосов
/ 01 июля 2019

У меня есть таблица со списком таблиц в PostgreSQL:

|id|table |
|--|------|
|1 |table1|
|2 |table2|
|3 |table3|

Я хочу выбрать из объединения всех этих таблиц, например (псевдокод):

select * from union(select table from tablenames)

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Чтобы автоматизировать это, вам нужен динамический SQL

CREATE OR REPLACE FUNCTION f_multi_select()
  RETURNS SETOF table1 AS
$func$
BEGIN
   RETURN QUERY EXECUTE
   (
   SELECT string_agg(format('SELECT * FROM %I', tbl), ' UNION ALL ')
   FROM   (SELECT tbl FROM tablenames ORDER BY id) sub
   );
END
$func$  LANGUAGE plpgsql;

Звоните:

SELECT * FROM f_multi_select();

Предполагая, что все таблицы имеют одинаковый тип строки, поэтому мы можем выбрать любую, чтобы определить тип возвращаемого значения функции.

Я добавил подзапрос с ORDER BY - в случае, если порядок таблиц имеет смысл.

Связанный:

0 голосов
/ 01 июля 2019

Вот один из способов сделать это без использования динамического SQL.Допустим, в вашей схеме только 10 возможных таблиц.Затем вы могли бы написать следующий запрос:

select * from table1 where 'table1' in (select "table" from tablenames) union all
select * from table2 where 'table2' in (select "table" from tablenames) union all
select * from table3 where 'table3' in (select "table" from tablenames) union all
...
select * from table10 where 'table10' in (select "table" from tablenames);

Недостаток этого подхода заключается в том, что он требует жесткого кодирования запроса для каждой возможной таблицы.

Я также предполагаю, что select *имеет смысл, потому что каждая из десяти таблиц будет иметь одинаковое количество и типы столбцов.

...