0

私はバッチモードの更新関数を書いていますが、現時点では次のようになっています:

CREATE OR REPLACE FUNCTION gen_category_counts()
RETURNS VOID as $$
BEGIN
    CREATE TEMPORARY TABLE category_stats ON COMMIT DROP AS
    WITH
        PC as(
            SELECT category_id, COUNT(*)
            FROM forum_posts fp
            INNER JOIN forum_topics ft
            ON ft.forum_id = fp.forum_id
            AND ft.id = fp.topic_id
            GROUP BY category_id
       ), 
        tc as(
            SELECT category_id, COUNT(*)
            FROM forum_topics
            GROUP BY category_id 
        )
    SELECT tc.category_id,tc.count AS topic_count, pc.count AS post_count
    FROM tc,pc
    WHERE tc.category_id = pc.category_id;

    UPDATE forum_category_nodes fcn 
    set post_count = category_stats.post_count, topic_count = category_stats.topic_count
    from category_stats
    where fcn.id = category_stats.category_id; 
END;
$$ LANGUAGE plpgsql;

関数の期間中だけ存続する一時テーブルを宣言するために文全体を書き出すよりも優れた構文糖衣はありますか?

Sql Server にはselect into #tablename(正確な構文を思い出せません。@tablename の可能性があります) があります。メーリング リストでこのスタイルの構文が使用されているのを見たことがありますが、構文的に正しくありselect into ませinto

では、postgres が暗黙的に定義されたスコープ付き一時テーブルに対してより優れた糖分を持っているとしたら、それは何ですか? :D

ps、私は何百行ものロジックを持つ手順を書くつもりであり、これらは合計されます:D

4

1 に答える 1

1

OK、ちょっとしたショートカット:

CREATE TEMP TABLE category_stats ON COMMIT DROP AS

それ以外は、私が知っている限り、あなたは質問で最も単純な形式を使用しています-そして私は過去数年間、一時テーブルをたくさん使用してきました.

正直なところ、いくつかの説明的なキーワードが気になる理由がわかりません。

于 2012-07-19T01:20:47.507 に答える