Если вы действительно не можете исправить свой дизайн (или не хотите использовать очень хорошее предложение от jmz), ваш единственный выбор - это, вероятно, функция возврата набора, которая создает необходимый UNION "на лету", а затем возвращаетрезультаты этого.
create or replace function my_union()
returns table(a integer, b integer, c integer)
as
$body$
declare
union_cursor refcursor;
table_cursor cursor for SELECT table_name FROM union_source;
union_query text := '';
begin
-- build the query string for the union
for table_list_record in table_cursor loop
if union_query '' then
union_query := union_query||' UNION ALL';
end if;
union_query := union_query||' SELECT a,b,c FROM '||table_list_record.table_name;
end loop;
-- run the union and return the result
for a,b,c IN EXECUTE union_query LOOP
return next;
end loop;
end;
$body$
language plpgsql;
Функция создает необходимый UNION на основе имен таблиц в union_source, а затем выполняет объединение и возвращает результат.
Вы можете расширить таблицу union_source и сохранить список столбцов для каждой таблицы, если столбцы не всегда имеют одинаковые имена.
Чтобы использовать эту функцию, просто выберите из нее:
select *
from my_union()