MERGE文(2)


ITコーディネータのシュウです。

1395797133260_2

前回の題材に上げたMERGE文について、SQL Serverではできないと思っている方もいるのではないかという話を聞き、今回はSQL Serverでもできることを報告します。

<本日の題材>
MERGE文(SQL Server編)

MERGE文の説明は前回既に行なったので、今回は省きます。
前回と同じ例をSQL Server2008で試してみました。

元データを商品テーブルA、登録・更新したいテーブルを商品テーブルBとします。

CREATE TABLE dbo.商品テーブルA(
商品CD VARCHAR(10)
, 商品名 VARCHAR(20)
, CONSTRAINT PK_商品テーブルA PRIMARY KEY (商品CD));

CREATE TABLE dbo.商品テーブルB(
商品CD VARCHAR(10)
, 商品名 VARCHAR(20)
, CONSTRAINT PK_商品テーブルB PRIMARY KEY (商品CD));

データがそれぞれ以下のような場合:
SELECT * FROM dbo.商品テーブルA;
sqls_merge_a

SELECT * FROM dbo.商品テーブルB;
sqls_merge_b

商品テーブルAのデータを元に、商品テーブルBに既に商品CDが存在するデータは、商品名を変更し、商品CDが存在しないものは商品テーブルBにデータを登録する場合のMERGE文を実行します。

MERGE INTO dbo.商品テーブルB
USING dbo.商品テーブルA
ON (dbo.商品テーブルA.商品CD = dbo.商品テーブルB.商品CD)
WHEN MATCHED THEN
UPDATE SET
商品名 = dbo.商品テーブルA.商品名
WHEN NOT MATCHED THEN
INSERT (商品CD,商品名)
VALUES (商品テーブルA.商品CD,商品テーブルA.商品名);
-- (2 行処理されました)

上記を実行した後に、商品テーブルBを確認すると、
SELECT * FROM 商品テーブルB;
sqls_merge_b_2

商品CD:00001 については、商品名のみ更新し、はじめは存在していなかった商品CD:00002 のデータが追加されているのが、SQL Server2008でも確認できました。

※SQL Server2008からMERGE文は対応するようになっていますので、それ以降のバージョンでは問題なく動作します。

別の例)
上記のような同じ構造のテーブルからの更新・登録ではなく、ユーザが何かのアプリで入力した場合のような定数値の情報からデータを更新・登録するケースもあるので、その際のMERGE文の例を以下に追記します。

例えば、変数@商品CD、@商品名を使用し、商品CD「00001」、商品名「商品1(甘さ控えめ)」という値を代入して使用する場合:

DECLARE @商品CD VARCHAR(10);
DECLARE @商品名 VARCHAR(20);

SET @商品CD = '00001';
SET @商品名 = '商品1(甘さ控えめ)';

MERGE INTO dbo.商品テーブルB
USING (SELECT @商品CD AS 商品CD, @商品名 AS 商品名) AS 商品情報
ON (dbo.商品テーブルB.商品CD = 商品情報.商品CD)
WHEN MATCHED THEN
UPDATE SET
商品名 =商品情報.商品名
WHEN NOT MATCHED THEN
INSERT (商品CD,商品名)
VALUES (商品情報.商品CD,商品情報.商品名);
--(1 行処理されました)

上記を実行した後に、商品テーブルBを確認すると、
SELECT * FROM 商品テーブルB;
sqls_merge_b_3

商品CD:00001 については、商品名が更新されているのが確認できます。

今日は以上まで

にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>