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をするで紹介しています。