【问题标题】:PostgreSQL: union of several tables using dynamic namesPostgreSQL:使用动态名称合并多个表
【发布时间】:2015-03-20 10:56:12
【问题描述】:

我在名为 qgep 的架构中有一组表(大约 100 个),名称以 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中的记录来自哪个类?

【问题讨论】:

  • They have all the same columns (colA, colB, colC).col_X 添加到所有的列中,所有的值都不同,然后将这些表合并为一个大表。
  • 动态 sql 仅适用于执行(或在 shell 脚本中:)
  • 我在脚本中使用它。无论如何,我希望找到一个更好的方法。或许能学到一点。
  • 为什么要一次性查询100张表?
  • 每个表都列出了值列表(选择组合框)的可能选项,并且选项以多种语言列出。我想生成一张大表用作字典。

标签: sql postgresql information-schema


【解决方案1】:
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()

【讨论】:

  • 非常感谢您的帮助。我想避免使用执行。我终于找到了使用继承的解决方案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2016-07-20
    • 2017-11-17
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多