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という便利な命令が準備されているので、テーブル同士を同期させる場合に活用してみるのもひとつの手法です。エンジニアとしてできることを増やしていきましょう。
Search キーワード検索
Popular 人気の記事
-
【VB.NET入門】DataGridViewの使い方まとめ
公開: 更新:
reccomended おすすめ記事
-
【.NETが統合】.NET 5の概要と今後のリリース予定
公開: 更新:
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
蔦屋書新店オープンに関するアプリ開発/Oracle/東京都渋谷区/【WEB面談可】/在宅勤務
月給56万~59万円東京都渋谷区(神泉駅) -
資産運用会社向け残高管理システム運用保守/SQLServer/東京都中央区/【WEB面談可】
月給50万~60万円東京都中央区(銀座駅) -
資産運用会社向け残高管理システム開発のテスター/SQLServer/東京都中央区/【WEB面談可】
月給25万~35万円東京都中央区(銀座駅) -
放射線部門システムパッケージの運用保守/Oracle/東京都港区/【WEB面談可】
月給50万~60万円東京都港区(品川駅) -
放射線部門システムパッケージの開発のテスター/Oracle/東京都港区/【WEB面談可】
月給25万~35万円東京都港区(品川駅) -
営業フロントシステム運用保守/ASP.NET/東京都江東区/【WEB面談可】
月給50万~60万円東京都江東区(木場駅)