我需要将年表中的数据合并到一个大表中。我对如何使用动态SQL(或其他)感到困惑。
所有这些都在MonetDB中,我认为它符合SQL 2008标准。我不确定它们是否支持分区,我宁愿在任何情况下合并我的表。
The Curse and Blessings of Dynamic SQL中关于SELECT * FROM sales + @yymm
的讨论最终未提及解决方案。
我在DBA下面的his answer评论中收到了一些关于MonetDB专家的相关文章的指导,但没有多年的循环,我仍然需要。
将我的数据视为包含CIVIL_1969
,CIVIL_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;
答案 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;