在同一个select中查询多个汇总表

时间:2018-02-05 15:08:14

标签: sql postgresql

我有几个月度汇总表,我需要在同一个报告中查询所有这些表。我该怎么做呢?以下是我的一些不起作用的想法。

aug_summary

sept_summary

oct_summary

`SELECT name, timestamp FROM aug_summary AND sept_summary AND oct_summary;` 

`select * from '*_summary'` 

2 个答案:

答案 0 :(得分:2)

您有几种方法可以解决此问题。

显而易见的一个是规范化您的数据库并将所有数据合并到包含"月"的单个表中。列,标识数据所在的月份。

这看起来像是手动创建的一些"分区"方案。因此,您可以选择将其转换为使用Postgres' built-in partitioning

的表格

作为一个快速修复,您可以简单地创建在所有表上执行联合的视图,这样您只需在数据库中拥有一个巨大的UNION,并且可以使用简单的select * from summary_table你的报告。

报告工作不需要更改。您只需在创建新摘要表后更改视图(您也不需要对规范化模型或分区进行操作)

您可以创建一个循环遍历可用表的函数,并返回每个表的内容:

create function get_summary()
  returns setof summary201711
as
$$
declare 
  l_sql text;
  l_rec record;
begin
  for l_rec in select schemaname, tablename 
               from pg_tables 
               where schemaname = 'public'
               and tablename like 'summary%' --<< adjust this to match your pattern
  loop
     l_sql = format('select * from %I.%I', l_rec.schemaname, l_rec.tablename);
     return query execute l_sql;
  end loop;
end;
$$
language plpgsql;

您用于returns setof summary201711的哪个表并不重要,因为他们都 具有相同的结构。

一旦你拥有了这个功能,就可以像这样使用它:

select *
from get_summary();

不确定会有多快。我的猜测是视图(或任何形式的分区)会更快。

答案 1 :(得分:0)

SELECT name, timestamp FROM aug_summary
 UNION
SELECT name, timestamp FROM sept_summary
 UNION
SELECT name, timestamp FROM oct_summary 

Etc等。