Para automatizar isso, você precisa de SQL dinâmico
CREATE OR REPLACE FUNCTION f_multi_select()
RETURNS SETOF table1
LANGUAGE plpgsql 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$;
Ligar:
SELECT * FROM f_multi_select();
Assumindo que todas as tabelas compartilham o mesmo tipo de linha - então podemos escolher qualquer um para definir o tipo de retorno da função.
Eu joguei uma subconsulta com
ORDER BY
- caso a ordem das tabelas seja significativa. Relacionado: