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

関連記事

SQLで順位を取得するRANK()とDENSE_RANK()

SQLで順位を取得する SQLServerで項目の順位付け関数を利用して 順位をします。

記事を読む

SQLでCASE~WHENを使ってみる(2)

CASE~WHENはSQLでCASE~WHENを使ってみるとは別に WHENの後に評価させる式を書

記事を読む

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

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

記事を読む

SQLServerでsp_renameを使ってテーブルの列名を変更する

SQLServerで列名を変更するには sp_renameを使って列名を変更 SQLServ

記事を読む

SQLでビット演算を行う

SQLServerでのビット演算 SQLServerのT-SQLでビット演算を使って、該当のデータ

記事を読む

SQLServer

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

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

記事を読む

SQLServerでSQLを使ってテーブルのカラム名(項目名)を取得する

SQLでテーブルのカラム名(項目名)を取得 Oracleでは とわりと簡単に取得できるの

記事を読む

SQLServer

SQLで検索結果を縦横変換する

SQLで検索結果を縦横変換する SQLで取得した各行を一定のくくりで横に表示させたいときがあります

記事を読む

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

指定した列名を利用しているテーブルを検索 SQLServerで指定した列名がどのテーブルで使用され

記事を読む

SELECT INTOで既存テーブルのデータを新規テーブルにコピーする

既存テーブルのデータを新規テーブルにコピーします。 簡単だが結構忘れるのでメモします。

記事を読む

Message

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


*

ALTER TABLEのALTER COLUMNで「列 ‘xxxxx’ に依存しています」とエラーになる

ALTER COLUMNで「列 'xxxxx' に依存しています」とエ

SQLで当月の第何週目の何曜日か取得する

SQLで今日は第何週、何曜日か取得する SQLServerでは関数で

SQLServerのバージョン番号を取得する方法

SQLServerのバージョン番号を取得する SQLServerのバ

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

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

ALTER TABLEでカラムの属性を変更する

ALTER TABLEでカラムの属性を変更する すでに作成されている

→もっと見る



PAGE TOP ↑