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を利用すればデータの
削除も行えます。

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

関連記事

no-img

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

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

記事を読む

no-img

日付の重複をSQLで検索する

SQLを使って期間の重複を見つけ出す SQLを使って、開始日付、終了日付を持っているレコードの

記事を読む

no-img

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

SQLで棒グラフの簡易版出力 SQLで棒グラフの簡易版を出力してみます。 1.テーブルの作成

記事を読む

a0001_013635

SQLServerのテーブルやカラムにコメントをつける方法

SQLServerでテーブルやカラムにコメントをつける SQLServerで作成したテーブルやカラ

記事を読む

no-img

SQLで西暦から和暦変換を行う

SQLを使って西暦から和暦変換を行う SQLServerには西暦和暦変換関数が無いようなので、

記事を読む

no-img

SQLで前の行と同じ値は表示しないようにする

前の行と同じ値は表示しない SQLで前の行と同じ値は表示しないようにするして 伝票印刷のような処

記事を読む

SQLサーバ

DATETIMEデータ型のミリ秒丸め現象

DATETIMEデータ型のミリ秒には丸めがあります SQLServerのDATETIMEデータ

記事を読む

keybord_black

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

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

記事を読む

no-img

SQLServerのダミーテーブル

SQLServerでダミーテーブルを使う データベースサーバから現在時刻などを取得する場合など

記事を読む

no-img

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

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

記事を読む

Message

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


*

no-img
SQLで指定月のカレンダー作成

ストアドプロシージャでカレンダーを作成する SQLServerでスト

SQLServer
SQLServerで取得した値を3ケタずつのカンマ区切りの表示に変更する方法です

SQLServerで取得した値を3ケタずつのカンマ区切りの表示に変更す

a0001_013635
SQLServerのテーブルロック状態を取得するSQL

SQLServerのデッドロックを調査している中で ロックの状態を調

no-img
データベースに登録されている内容を固定長の長さで出力する(2)

登録されている内容を固定長の長さで出力する 先日作成したデータベース

keybord_black
@@ROWCOUNTで処理した件数を取得する

@@ROWCOUNTは直前に処理した件数を取得するための関数 SQL

→もっと見る



PAGE TOP ↑