1

この例では、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関数を使用してこのタイプのことを行うことはできますか?

4

3 に答える 3

1

これを行うSQL関数はありません。

テーブルのリストをExcelに配置することをお勧めします。次に、次のような式を入力します。

="select * from "&a1&" union all"

この式をコピーしてください。出来上がり!あなたはほとんどビューの定義を持っています。

これらのステートメントを含む列をSQLコマンドツールにコピーします。上部にを追加しcreate viewます。最後にを削除しunion allます。そして出来上がり。ビューを簡単に作成できます。

于 2013-01-22T19:39:26.647 に答える
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;
于 2013-01-22T22:44:53.393 に答える
1

テーブルのリストを、単一のマスターテーブルと複数の子テーブルを使用してパーティション化されたテーブルとして再定義することを検討してください。http://www.postgresql.org/docs/9.2/static/ddl-partitioning.html

または、ビューを維持してすべてのテーブルを結合し、スキーマに新しいテーブルを追加するときに、それもビューに追加します。

于 2013-01-23T09:08:10.250 に答える