MERGEでINSERTとUPDATEを1行で実行する

公開日: : 最終更新日:2016/07/19 SQL Server , , ,

MERGE文を使うと行の存在有無を気にせずに1行のSQLでOK



あるテーブルのデータを更新する際には「該当行があればUPDATE、
無ければINSERT」のようにデータが存在するかどうかでIF文を
書いてINSERTとUPDATEを切り分ける必要がある。

そんな面倒を解決するためにSQLServer 2008からは
MERGE文が利用できるようになりました。
これを利用すると、指定した条件に応じて
挿入(INSERT)、更新(UPDATE)、削除(DELETE)を
実行することが可能になります。

MERGEステートメントの構成

MERGEステートメントは、次の主要な句で構成されています。

MERGE句 挿入(INSERT)、更新(UPDATE)、削除(DELETE)の各操作の対象となるテーブルまたはビューを指定します。
USING句 対象と結合されるデータ ソースを指定します。
ON句 対象とソースが一致しているかどうか判断する結合条件を指定します。
WHEN句 WHEN MATCHED、WHEN NOT MATCHED BY TARGET、および WHEN NOT MATCHED BY SOURCE は、ON句の結果、および WHEN 句で指定した追加の検索条件の結果に基づいて実行する操作を指定します。
OUTPUT句 挿入(INSERT)、更新(UPDATE)、削除(DELETE)される対象の行ごとに 1 行を返します。

1つのテーブルに対するMERGE文

以下は1つのテーブルに対してのMERGE文で、
該当行があればUPDATE(更新)、なければINSERT(挿入)します。

UPDATE(更新)の例

以下はデータが存在した場合のUPDATE(更新)の例です。

上記の実行結果は

になります。

最初に検証用に挿入した「nameが二郎さん,ageが40」の
データが「nameが太郎さん,ageが30」に更新されています。
ON以下の「A.no=B.no」の条件が一致したので
UPDATE(更新)されています。

INSERT(挿入)の例

以下はデータが存在しない場合のINSERT(挿入)の例です。

上記の実行結果は

になります。

ON以下の「A.no=B.no」の条件が一致しなかったので
INSERT(挿入)されています。

2つのテーブルから結果をMERGEするMERGE文

以下は2つのテーブルに対してのMERGE文で、
test_tableAにtest_tableBの該当行があればUPDATE(更新)、
なければINSERT(挿入)します。

UPDATE(更新)の例

以下はデータが存在した場合のUPDATE(更新)の例です。

上記の実行結果は

になります。

test_tableAにもtest_tableBにも「no=10」の太郎さんが
存在したのでtest_tableBの内容でtest_tableAの太郎さんが
更新されています。

INSERT(挿入)の例

以下はデータが存在した場合のINSERT(挿入)の例です。

上記の実行結果は

になります。

test_tableAには「no=10」の太郎さんが
存在しなかったのでtest_tableBの内容でtest_tableAに
太郎さんが挿入されています。

このようにMERGE文を利用するればIF文で該当データの
存在確認をせずにUPDATE(更新)したりINSERT(挿入)したり
できます。
また、UPDATEの代わりにDELETEを利用すればデータの
削除も行えます。

スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • 13 follow us in feedly

関連記事

2つのテーブルを結合して値を更新するSQL

2つのテーブルを結合して値を更新するSQL テーブルAの値をテーブルBの値で上書き(更新)するSQ

記事を読む

SQL Server2008で導入された[date/time/datetime2/datetimeoffset]型

SQL Server2008では新しい日付/時刻データ型 date/time/datetime2/

記事を読む

春分の日と秋分の日をSQLで求める計算式

春分の日と秋分の日は毎年違う 春分の日と秋分の日は 祝日としての春分の日・秋分の日は、 前

記事を読む

SQLで月曜日始まりのカレンダー作成

カレンダー作成 SQLServerで月曜日始まりの1週間分のカレンダーを作成します。 実行す

記事を読む

ORDER BYでNULLのカラムを最後に表示

ORDER BYでNULLのカラムを最後に持ってくる SQLで何も考慮せずに「ORDER BY」す

記事を読む

SQLServer

bcpコマンドを使ってBULK INSERT用のフォーマットファイルを出力する

bcpコマンドを使ってBULK INSERT用のフォーマットファイルを出力する bcpコマンドを使

記事を読む

テーブルから列を削除する「ALTER TABLE テーブル名 DROP COLUMN 削除する列名」

既存のテーブルから指定した列を削除する 既存のテーブルで不要になった列を削除する方法です。

記事を読む

SQLでランダムにユニーク(一意)な値(ID)を取得する

ランダムにユニーク(一意)な値(ID)を取得する SQLServerでテーブル内でユニークキーをラ

記事を読む

SQLServerで自動で連番を設定する

カラムに自動で連番を設定する 自動で連番を設定し、レコードを管理する場合に 重宝するカラムの属性

記事を読む

SQLServer

テーブルのプライマリキー(PK)を取得する(SQL編)

SQLServerでテーブルのプライマリキー(PK)をSQLで取得する SQLServerでテーブ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

SQLで棒グラフの簡易版を出力する

SQLで棒グラフの簡易版出力 SQLで棒グラフの簡易版を出力してみま

春分の日と秋分の日をSQLで求める計算式

春分の日と秋分の日は毎年違う 春分の日と秋分の日は 祝日として

SQLServer
SQLServerで「WITH ROLLUP」を使って小計、総合計を出力する

「WITH ROLLUP」を使って小計、総合計を出力 SQLServ

指定した列名がどのテーブルで使用されているか検索するSQL

指定した列名を利用しているテーブルを検索 SQLServerで指定し

ISNULLとCOALESCEは動作が異なる

ISNULLとCOALESCEは動作が異なるので注意が必要 とある人

→もっと見る



PAGE TOP ↑