SQL 別テーブルをSELECTした結果をそのままINSERTする方法
あるテーブル(A)に登録されているデータを利用して別のテーブル(B)にデータを登録したい場合があります。
AをSELECTして、取得したデータを1件ごとBにINSERTするのではなく、AをSELECTした結果をそのままBにINSERTしたほうが効率的です。
以下のように、INSERT INTOのあとのVALUESの代わりに、SELECT文をそのまま使用します。
INSERT INTO B (
BCOL1,
BCOL2
)
SELECT
COL1,
COL2
FROM A
WHERE --必要に応じて追加SELECTで取得する列の順番と、INSERTするテーブル(B)の列の順番が一致するようにします。
PL/SQLなどではCURSORを使ったループ処理で件数回数分INSERTを実行するように実装してしまいがちですが、上記のようにSELECT-INSERTで登録したほうが実装も簡単ですし、パフォーマンスも改善されることが多いので、この方法は覚えておくと便利です。
データの存在チェック
SELECTした結果INSERTするときに、すでに同じデータが登録されていた場合は主キー重複のエラーになってしまいます。
SELECTした結果(INSERTしようとするデータ)が登録先のテーブルに存在しているかどうか(同一の主キーですでに登録されているかどうか)のチェックを合わせて行いたい場合はMERGE文を使用します。
MERGE文を使えば、すでに存在している場合はINSERTではなくUPDATEで更新することも可能です。
MERGE文の詳しい使い方についてはSQL MERGE文でSELECTした結果を使ってINSERTまたはUPDATEをするで紹介しています。