0

年間テーブルのデータを 1 つの大きなテーブルにマージする必要があります。これに動的SQL(またはその他)をどのように使用する必要があるかについて混乱しています。

これはすべて、SQL 2008 標準に準拠した MonetDB にあると思います。ただし、パーティション分割がサポートされているかどうかはわかりません。いずれにせよ、テーブルをマージしたいと思います。

The Curse and Blessings of Dynamic SQLSELECT * FROM sales + @yymmでの議論は、最終的に解決策について言及していません。

DBA に関する彼の回答の下のコメントで、MonetDB の専門家から関連する部分についていくつかのガイダンスを受け取りましたが、何年にもわたるループはなく、まだ必要です。

…のようCIVIL_1969なテーブルを持つデータを考えてみてください。これらは通常、同じスキーマに従いますが、列はありません。列もある単一のテーブルが必要です。CIVIL_1970CIVIL_2012yearCIVILyear

ところで、年ごとにスキーマが変化するテーブルがあります (たとえば、納税申告書は年ごとに異なるレコードを収集します)。これらのテーブルもマージできますか? 確かに、一部の列にはまばらなレコードがあり、何年もの間行方不明になっていました。

これに関するいくつかの非常に暫定的な擬似コード:

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;
4

1 に答える 1

1

monetdb はわかりませんが、ビューをサポートしていると思います。1 つの方法は、データのマージを記述するビューを作成し、それを使用してテーブルに挿入することです。すなわち:

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;
于 2014-05-17T21:26:08.647 に答える