MERGE文の使い方
MERGE文は、DMLに属する構文です。
DML
Data Manipulation Language の略でデータ操作文のこと
Data(データ)Manipulation(操作)Language(文)
Data Manipulation Language の略でデータ操作文のこと
Data(データ)Manipulation(操作)Language(文)
例えば、通常使用している「テーブルA」とバックアップ用の「テーブルB」があります。
テーブルAの内容をテーブルBにバックアップとして保管したい場合に使えるSQLです。
処理内容は下記の通りです。
- テーブルAのデータがテーブルBに存在しない場合は「INSERT」処理を実行する。
- テーブルAのデータがテーブルBに存在する場合は「UPDATE」処理を実行する。
- テーブルBにしか存在しない場合は「DELETE」処理を実行する。
基本構文
MERGE ターゲットテーブル(変更先) USING ソーステーブル(変更元) ON ふたつのテーブルの結合条件(主キーなど) WHEN MATCHED THEN ソーステーブルのデータがターゲットテーブルに存在する場合に行うUPDATE文 WHEN NOT MATCHED BY TARGET THEN ソーステーブルのデータがターゲットテーブルに存在しない場合に行うINSERT文 WHEN NOT MATCHED BY SOURCE THEN ターゲットテーブルにしか存在しない場合に行うDELETE文 ;
読み方は、
- 2つのテーブルをマージするよ
- 紐づけは主キーで、主キーが同じなら同じレコードとみなすよ
- ターゲットテーブルとソーステーブルの主キーが同じデータがあれば、ターゲットテーブルを更新するよ
- ソーステーブルにしかレコードがない場合は、登録 するよ
- ターゲットテーブルにしかレコードがない場合、削除 するよ
です。
パッと見は、複雑な気がしますが、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
コメント