动态sql:合并分区表(年度表到所有年份的单个表)

时间:2014-05-17 20:19:44

标签: sql union dynamic-sql database-partitioning monetdb

我需要将年表中的数据合并到一个大表中。我对如何使用动态SQL(或其他)感到困惑。

所有这些都在MonetDB中,我认为它符合SQL 2008标准。我不确定它们是否支持分区,我宁愿在任何情况下合并我的表。

The Curse and Blessings of Dynamic SQL中关于SELECT * FROM sales + @yymm的讨论最终未提及解决方案。

我在DBA下面的his answer评论中收到了一些关于MonetDB专家的相关文章的指导,但没有多年的循环,我仍然需要。

将我的数据视为包含CIVIL_1969CIVIL_1970 ... CIVIL_2012等表格。这些通常遵循相同的架构,但没有year列。我希望有一个CIVIL表,也有year列。

顺便说一下,有些表格的架构每年都会发生变化(例如税务表格收集了不同年份的不同记录)。是否也可以合并这些表格?当然,有些专栏会有稀疏的记录,多年来一直缺失。

一些非常试探性的伪代码:

USE dbfarm
DECLARE @i INT
SET @i = 1990
SELECT name FROM tables WHERE name LIKE 'data_@i';
WHILE @i < 2013
DO
    ALTER TABLE data_@i ADD COLUMN "year" INTEGER; UPDATE data_@i SET "year" = @i;
    SET @i = @i +1
END WHILE
CREATE TABLE data AS SELECT * FROM data_1990 UNION ALL SELECT * FROM data_1991 UNION ALL [...] WITH DATA;

1 个答案:

答案 0 :(得分:1)

我不知道monetdb,但我认为它们支持视图。一种方法是创建描述数据合并的视图,然后使用该视图插入表中。即:

create view v as (
    select 1969 as year, c1, c2, ..., cn, cast(null as ...) -- col introduced in 1973
         , cast(null as ...) -- col introduced in 1987
    union all 
    ...
    select 1973 as year, c1, c2, ..., cn, cn_1, , cast(null as ...) -- introduced in 1987   
    union all
    ...
)

insert into data (...) select ... from v;