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

2024-03-05

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

我想做的是得到一张大桌子,它是我所有的的联合体vl_*表,还有一列包含原始表的名称。

我可以获得表格列表:

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?


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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL:使用动态名称的多个表的联合 的相关文章

随机推荐