MERGE文の使い方

SQL Server
この記事は約4分で読めます。

MERGE文の使い方

MERGE文は、DMLに属する構文です。

DML
Data Manipulation Language の略でデータ操作文のこと
Data(データ)Manipulation(操作)Language(文)

例えば、通常使用している「テーブルA」とバックアップ用の「テーブルB」があります。

テーブルAの内容をテーブルBにバックアップとして保管したい場合に使えるSQLです。

処理内容は下記の通りです。

  1. テーブルAのデータがテーブルBに存在しない場合は「INSERT」処理を実行する。
  2. テーブルAのデータがテーブルBに存在する場合は「UPDATE」処理を実行する。
  3. テーブルBにしか存在しない場合は「DELETE」処理を実行する。

 

基本構文

MERGE ターゲットテーブル(変更先)
USING ソーステーブル(変更元)
ON ふたつのテーブルの結合条件(主キーなど)
WHEN MATCHED
   THEN  
        ソーステーブルのデータがターゲットテーブルに存在する場合に行うUPDATE文
WHEN NOT MATCHED BY TARGET
   THEN  
        ソーステーブルのデータがターゲットテーブルに存在しない場合に行うINSERT文
WHEN NOT MATCHED BY SOURCE
   THEN
        ターゲットテーブルにしか存在しない場合に行うDELETE文
;

読み方は、

  1. 2つのテーブルをマージするよ
  2. 紐づけは主キーで、主キーが同じなら同じレコードとみなすよ
  3. ターゲットテーブルとソーステーブルの主キーが同じデータがあれば、ターゲットテーブルを更新するよ
  4. ソーステーブルにしかレコードがない場合は、登録 するよ
  5. ターゲットテーブルにしかレコードがない場合、削除 するよ

です。

パッと見は、複雑な気がしますが、1行づつ処理を見ていくとたいしたことは書いてませんね。

重要
マージ文の最後はセミコロン(;)で〆ます。忘れると構文エラーになります。

また、それぞれの条件は全て書く必要はなく実行したいことだけ書いてもOKです。

UPDATE(更新)のみしたい場合

MERGE ターゲットテーブル(変更先)
USING ソーステーブル(変更元)
ON ふたつのテーブルの結合条件(主キーなど)
WHEN MATCHED
   THEN  
         ソーステーブルのデータがターゲットテーブルに存在する場合に行うUPDATE文
;

INSERT(登録)のみしたい場合

MERGE ターゲットテーブル(変更先)
USING ソーステーブル(変更元)
ON ふたつのテーブルの結合条件(主キーなど)
WHEN NOT MATCHED BY TARGET
   THEN  
         ソーステーブルのデータがターゲットテーブルに存在しない場合に行うINSERT文
;

DELETE(削除)のみしたい場合

MERGE ターゲットテーブル(変更先)
USING ソーステーブル(変更元)
ON ふたつのテーブルの結合条件(主キーなど)
WHEN NOT MATCHED BY SOURCE
   THEN
        ターゲットテーブルにしか存在しない場合に行うDELETE文
;

サンプルコード

サンプルコードです。

実際にコピペして動かしてみてください。

CREATE TABLE A
(
ID		INT			NOT NULL PRIMARY KEY,
NAME	VARCHAR(50) NULL,
);

INSERT INTO A (ID,NAME) VALUES(1,'バナナ')
INSERT INTO A (ID,NAME) VALUES(3,'りんご')

CREATE TABLE B
(
ID		INT			NOT NULL PRIMARY KEY,
NAME	VARCHAR(50) NULL,
)

INSERT INTO B (ID,NAME) VALUES(1,'いちご')
INSERT INTO B (ID,NAME) VALUES(4,'みかん')


SELECT * FROM A
--1	バナナ
--3	りんご

SELECT * FROM B
--1	いちご
--4	みかん


--AをBにマージする
MERGE B AS TB -- (変更先)ターゲットテーブル
USING A AS TA -- (変更元)ソーステーブル
ON TB.ID = TA.ID
WHEN MATCHED
	THEN 
		UPDATE 
		SET TB.NAME = TA.NAME
WHEN NOT MATCHED BY TARGET
	THEN
		INSERT (ID,NAME) VALUES(TA.ID,TA.NAME)
WHEN NOT MATCHED BY SOURCE
	THEN
		DELETE
;

SELECT * FROM A
--1	バナナ
--3	りんご

SELECT * FROM B
--1	バナナ
--3	りんご

DROP TABLE A
DROP TABLE B

コメント

タイトルとURLをコピーしました