我在名为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
中记录的哪个类?
答案 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;