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

システム開発の現場では、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を利用してコーディングを進めます。
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; |
実行結果
- SE
- MERGE文を使いこなせば、より簡潔にテーブルの同期が行えるのですね。早速使ってみます!
- PM
- コーディングもすっきりとして見やすいかと思います。誰が見ても分かりやすく簡潔にコーディングすることはとても大切です。MERGE文は積極的に活用していきたいと命令のひとつですね。
SQL ServerのMERGE文を使いこなそう
ここではMERGE文について解説しましたが、UPDATE、INSERT、DELETEと分かれてコーディングしている開発現場も多いといわれています。それでも問題はありませんが、SQL ServerにはMERGEという便利な命令が準備されているので、テーブル同士を同期させる場合に活用してみるのもひとつの手法です。エンジニアとしてできることを増やしていきましょう。