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

时间:2015-03-20 10:56:13

标签: sql postgresql information-schema

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

我想要做的是获得一个大表,它是所有vl_*表的并集,还有一个包含原始表名称的列。 < / p>

我可以得到表格列表:

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中记录的哪个类?

2 个答案:

答案 0 :(得分:3)

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()

答案 1 :(得分:0)

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

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