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

システム開発の現場では、SQLを活用してテーブルへの更新や挿入、削除を行うことは基本の業務です。しかし、テーブルの同期を行う際にUPDATEやINSERT、DELETEをそれぞれ記載していると、冗長なプログラムとなり、デバッグや修正作業が大変になることも考えられます。
SQL ServerではMERGE文が利用でき、UPDATEやINSERT、DELETEをまとめてコーディングできます。ここでは、MERGE文の活用方法を確認していきましょう。
- システム
エンジニア - 同じ構造を持つ2つのテーブルを同期するよう仕様書に明記されています。この場合、UPDATEとINSERTとDELETE用のサブルーチンを設けてコーディングする必要がありますよね?
- プロジェクト
マネージャー - 確かに、それぞれのルーチンを準備するのもひとつのやり方です。でもここは、ワンランク上のプログラマーを目指すためも「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を利用してコーディングを進めます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CREATE TABLE DB_TEST.dbo.Country1 ( ID INT NOT NULL PRIMARY KEY, Country VARCHAR(50) NULL, City VARCHAR(50) NULL ); INSERT INTO DB_TEST.dbo.Country1 (ID, Country, City) VALUES (1, 'JAPAN', 'TOKYO'), (2, 'FRANCE', 'PARIS'), (3, 'ENGLAND', 'LONDON'), (4, 'USA', 'New York'), (5, 'GERMANY', 'BERLIN'), (6, 'BRAZIL', 'BRASILIA'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE TABLE DB_TEST.dbo.Country2 ( ID INT NOT NULL PRIMARY KEY, Country VARCHAR(50) NULL, City VARCHAR(50) NULL ); INSERT INTO DB_TEST.dbo.Country2 (ID, Country, City) VALUES (1, 'JAPAN', 'OSAKA'), (4, 'USA', 'Los Angeles'), (7, 'CHINA', 'Hong Kong'); |
上記の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文の基本構文です。他にもオプションはありますが、まずはこの基本構文をおさえておきましょう。
1 2 3 4 5 6 7 8 9 10 |
MERGE ターゲットテーブル(変更先) USING ソーステーブル(変更元) ON ふたつのテーブルの結合条件(今回はIDを指定) WHEN MATCHED THEN ソーステーブルのデータがターゲットテーブルに存在する場合に行うUPDATE文 WHEN NOT MATCHED BY TARGET THEN ソーステーブルのデータがターゲットテーブルに存在しない場合に行うINSERT文 WHEN NOT MATCHED BY SOURCE THENターゲットテーブルにしか存在しない場合に行うDELETE文 ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
MERGE DB_TEST.dbo.Country2 AS C2 USING DB_TEST.dbo.Country1 AS C1 ON C2.ID = C1.ID WHEN MATCHED THEN UPDATE SET C2.Country = C1.Country, C2.City = C1.City WHEN NOT MATCHED BY TARGET THEN INSERT (ID, Country, City) VALUES (C1.ID, C1.Country, C1.City) WHEN NOT MATCHED BY SOURCE THEN DELETE; |
実行結果
- システム
エンジニア - MERGE文を使いこなせば、より簡潔にテーブルの同期が行えるのですね。早速使ってみます!
- プロジェクト
マネージャー - コーディングもすっきりとして見やすいかと思います。誰が見ても分かりやすく簡潔にコーディングすることはとても大切です。MERGE文は積極的に活用していきたいと命令のひとつですね。
SQL ServerのMERGE文を使いこなそう
ここではMERGE文について解説しましたが、UPDATE、INSERT、DELETEと分かれてコーディングしている開発現場も多いといわれています。それでも問題はありませんが、SQL ServerにはMERGEという便利な命令が準備されているので、テーブル同士を同期させる場合に活用してみるのもひとつの手法です。エンジニアとしてできることを増やしていきましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅)遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅)病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅)開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅)債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅)PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)