zukucode
主にWEB関連の情報を技術メモとして発信しています。

SQL 別テーブルをSELECTした結果をそのままINSERTする方法

あるテーブル(A)に登録されているデータを利用して別のテーブル(B)にデータを登録したい場合があります。

ASELECTして、取得したデータを1件ごとBINSERTするのではなく、ASELECTした結果をそのままBINSERTしたほうが効率的です。

以下のように、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をするで紹介しています。


関連記事