我有几个月度汇总表,我需要在同一个报告中查询所有这些表。我该怎么做呢?以下是我的一些不起作用的想法。
aug_summary
sept_summary
oct_summary
`SELECT name, timestamp FROM aug_summary AND sept_summary AND oct_summary;`
?
`select * from '*_summary'`
答案 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等。