私はPostgreSQLで関数を書いています。それは基本的に3つのステップを行います:
- ソース テーブルからレコードを取得します。
- ターゲット テーブルでフェッチされたレコードの値を確認し、ターゲット テーブルでレコードが見つかった場合は、フェッチされたレコードでターゲット テーブルのすべての値を更新します。そうでない場合は、フェッチされたレコードをターゲット テーブルに挿入します。
このループを実行する代わりに、挿入/更新用の単一のクエリを作成すると、上記のアプローチよりも高速になりますか? すべてのレコードをループして更新/挿入を行う代わりに、単一のクエリを記述して同じ結果を得るにはどうすればよいですか。
私の現在のアプローチは以下の通りです
CREATE OR REPLACE FUNCTION fun1()
RETURNS void AS
$BODY$DECLARE
source_tab_row RECORD;
v_col1 TEXT;
v_col2 TEXT;
v_col3 TEXT;
v_col4 double precision ;
cnt integer;
BEGIN
FOR source_tab_row IN (SELECT * FROM source_tab where col5='abc')
LOOP
v_col1=source_tab_row.col1;
v_col2=source_tab_row.col2;
v_col3=source_tab_row.col3;
v_col4=source_tab_row.col4;
select count(*) INTO cnt from dest_tab where col1=v_col1;
if (cnt =0) then
-- If records is not found
INSERT INTO dest_tab(col1, col2, col3,col4)
VALUES( v_col1, v_col2, v_col3,v_col4) ;
else
--if records found then update it
update dest_tab set col1=v_col1, col2=v_col2, col3=v_col3,col4=v_col4
where col1=v_col1;
end if;
END LOOP;
END;
$BODY$ LANGUAGE plpgsql;