SQL脚本给UNION提供了大量的表

时间:2013-01-22 19:30:50

标签: sql postgresql plpgsql postgresql-8.3

在本例中,我必须在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函数来执行此类操作,而不是手动写出每个单独的选择吗?

3 个答案:

答案 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

或者,维护一个视图以将所有表合并在一起,当您向模式添加新表时,也将它添加到视图中。