.net column

.NET開発者のためのブログメディア

SQL ServerのMERGE文を解説。データの同期を1行で実行する

2020年07月28日

システム開発の現場では、SQLを活用してテーブルへの更新や挿入、削除を行うことは基本の業務です。しかし、テーブルの同期を行う際にUPDATEやINSERT、DELETEをそれぞれ記載していると、冗長なプログラムとなり、デバッグや修正作業が大変になることも考えられます。
SQL ServerではMERGE文が利用でき、UPDATEやINSERT、DELETEをまとめてコーディングできます。ここでは、MERGE文の活用方法を確認していきましょう。

SE
同じ構造を持つ2つのテーブルを同期するよう仕様書に明記されています。この場合、UPDATEとINSERTとDELETE用のサブルーチンを設けてコーディングする必要がありますよね?
PM
確かに、それぞれのルーチンを準備するのもひとつのやり方です。でもここは、ワンランク上のプログラマーを目指すためも「MERGE」を活用してコーディングを進めていきましょう!

MERGE文でできること【更新・挿入・削除】

システム開発の現場で、同じようなテーブル構造を持つ2つのテーブルがあるとします。仕様書には以下の文言が記載されています。

  • ・テーブルAのデータがテーブルBに存在する場合は「UPDATE」処理を実行する
  • ・テーブルAのデータがテーブルBに存在しない場合は「INSERT」処理を実行する
  • ・テーブルBにしか存在しない場合は「DELETE」処理を実行する
  • (テーブルAとテーブルBは同じテーブル構造を持つ)

この場合、IF文などを多用すると冗長なプログラムになってしまいます。
SQL Serverでは、MERGE文が準備されています。上記の場合はMERGE文を活用して、「UPDATE」「INSERT」「DELETE」を一度の処理で行うようにしましょう。整理された見やすいコーディングとなるはずです。

なお、上記のテーブルAを変更元のテーブルとして「ソーステーブル」、テーブルBを変更先のテーブルとして「ターゲットテーブル」と、それぞれ呼ばれる場合があります。

SQL Serverを操作!同期するテーブルの作成

まずはMERGE処理を実施する前にテーブルを準備して、データを格納しておく必要があります。
以下、ソーステーブルとターゲットテーブルを作成します。今回は、SQL Server 2018を利用してコーディングを進めます。

上記のSQLを実行した結果、以下のソーステーブルとターゲットテーブルが作成されました。

DB_TEST.dbo.Country1:ソーステーブル(変更元)

ID Country City
1 JAPAN TOKYO
2 FRANCE PARIS
3 ENGLAND LONDON
4 USA New York
5 GERMANY BERLIN
6 BRAZIL BRASILIA

DB_TEST.dbo.Country2:ターゲットテーブル(変更先)

ID Country City
1 JAPAN OSAKA
4 USA Los Angeles
7 CHINA Hong Kong

上記2つのテーブルを準備し、データを格納できました。それでは、ターゲットテーブルに対して、MERGE処理を行っていきましょう。

MERGE文を使ってテーブルのデータを同期

MERGE文の結合条件はID項目とします。

下記、MERGE文の基本構文です。他にもオプションはありますが、まずはこの基本構文をおさえておきましょう。

実行結果
MERGEの結果

SE
MERGE文を使いこなせば、より簡潔にテーブルの同期が行えるのですね。早速使ってみます!
PM
コーディングもすっきりとして見やすいかと思います。誰が見ても分かりやすく簡潔にコーディングすることはとても大切です。MERGE文は積極的に活用していきたいと命令のひとつですね。

SQL ServerのMERGE文を使いこなそう

ここではMERGE文について解説しましたが、UPDATE、INSERT、DELETEと分かれてコーディングしている開発現場も多いといわれています。それでも問題はありませんが、SQL ServerにはMERGEという便利な命令が準備されているので、テーブル同士を同期させる場合に活用してみるのもひとつの手法です。エンジニアとしてできることを増やしていきましょう。

>>>SQL Serverの案件を探すならFEnet .NET Navi


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)