PostgreSQL:使用动态名称联合多个表

PostgreSQL: union of several tables using dynamic names

我在名为 qgep 的模式中有一组 table(大约 100 个),名称以 vl_ 开头。 它们具有所有相同的列(colA、colB、colC)。

我想做的是得到一个大的 table 这是我所有 vl_* table 的联合,还有一列用原来的名字table.

我可以获得 table 的列表:

SELECT table_name
  FROM information_schema.tables 
  WHERE table_schema = 'qgep' 
  AND table_name LIKE 'vl_%'

我发现解决问题的唯一方法是生成 SQL 命令以进一步执行它:

SELECT
  string_agg(
    'SELECT '''
    ||table_name
    ||''' AS table_name, colA, colB, colC FROM qgep.'
    ||table_name
  , ' UNION ')::text 
FROM information_schema.tables 
  WHERE table_schema = 'qgep' 
  AND table_name LIKE 'vl_%'"

然后执行这个SQL命令就会输出我想要的。虽然,它的性能很差,而且很丑...

我想避免使用 EXECUTE。 你有什么建议吗? 我可以使用 WITH ... UNION ALL 做些什么吗?

继承对我有帮助吗?是否可以知道select中的记录来自class?

create or replace function uall() returns table ( code integer ,
  value character varying(50),
  active boolean,tablename text ) AS $$ 
declare
  _i int;
  _r record;
  _t text := '';
begin 
  select distinct string_agg($s$select *,'$s$||table_name||$s$' from $s$||table_name,' union all ') into _t from information_schema.tables where table_name like 'vl_%';
return query execute _t;
end;$$ language plpgsql
;

select * from uall()

解决方案确实是使用继承,我终于在Postgres doc上找到了解决方案。

SELECT p.relname, vl.* 
FROM qgep.is_value_list_base vl, pg_class p 
WHERE vl.tableoid = p.oid;