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