在本例中,我必须在2012-12-17至2012-10-30之间进行大量不相交的每日表的联合。这里的代码变得丑陋是片段:
CREATE table map
with (appendonly=true, compresstype = quicklz)
AS
SELECT * FROM final_map_12_17
UNION ALL
SELECT * FROM final_map_12_16
UNION ALL
SELECT * FROM final_map_12_15
UNION ALL
SELECT * FROM final_map_12_14
UNION ALL
....
SELECT * FROM final_map_10_30;
我可以使用序列或PL / PGSQL函数来执行此类操作,而不是手动写出每个单独的选择吗?
答案 0 :(得分:1)
没有SQL函数可以执行此操作。
我建议您将表格列表放在Excel中。然后输入如下公式:
="select * from "&a1&" union all"
复制此公式。瞧!你几乎有了查看定义。
将包含这些语句的列复制到SQL命令工具中。在顶部添加create view
。最后删除union all
。瞧。您可以轻松创建视图。
答案 1 :(得分:1)
您可以在plpgsql函数中循环遍历日期范围,如下所示:
create or replace function add_map(date_from date, date_to date)
returns void language plpgsql as $$
declare
day date;
begin
for day in
select generate_series(date_from, date_to, '1 day')
loop
execute 'insert into map select * from final_map_'||
to_char(extract(month from day), '09')|| '_' ||
to_char(extract(day from day), '09');
end loop;
end; $$;
调用该函数:
-- create table map (....);
select add_map('2012-11-30', '2012-12-02');
相当于:
insert into map select * from final_map_11_30;
insert into map select * from final_map_12_01;
insert into map select * from final_map_12_02;
答案 2 :(得分:1)
考虑将表列表重新定义为分区表,使用单个主表和多个子表。 http://www.postgresql.org/docs/9.2/static/ddl-partitioning.html
或者,维护一个视图以将所有表合并在一起,当您向模式添加新表时,也将它添加到视图中。