MERGE文でデータの存在を確認せずにINSERTまたUPDATEを実行する方法

2019/11/14データベースSQLServer

記事内に広告が含まれています。

SQLServerではMERGE文を使うと更新先に該当のキーのデータがあるかないかをIF文で確認したりせずに1行でINSERTもしくはUPDATE文を切り替えて実行することができます。

MERGE文でデータの存在を確認せずにINSERTまたUPDATEを実行する方法

本来、ユニークキーが設定されているテーブルに対してデーターの追加、更新を行う際は、まず該当のデータが存在するかどうかのチェック(一旦SELECT)してからINSERTかUPDATEをIF文で切り替えて実行します。

ところがMERGE文を使えばこの事前チェックなしにINSERTかUPDATEを1行で実行できるようになります。

MERGE文の使い方

以下のSQLが実際のMERGE文の使い方になります。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
-----------------------------------------
--コピー元とコピー先のテーブルを生成する
-----------------------------------------
CREATE TABLE #moto_table
(
     no      SMALLINT
    ,name    VARCHAR(20)
    ,age     SMALLINT
)
CREATE TABLE #saki_table
(
     no      SMALLINT
    ,name    VARCHAR(20)
    ,age     SMALLINT
)
  
-----------------------------------------
--コピー元とコピー先のデータを生成する
-----------------------------------------
INSERT INTO #moto_table VALUES( 10, 'モト・太郎さん', 30 );
INSERT INTO #moto_table VALUES( 20, 'モト・次郎さん', 35 );
INSERT INTO #saki_table VALUES( 10, 'サキ・太郎さん', 40 );
 
-----------------------------------------
--コピー元とコピー先のデータを参照する
-----------------------------------------
SELECT no, name, age FROM #moto_table ORDER BY no
SELECT no, name, age FROM #saki_table ORDER BY no
 
-----------------------------------------
--コピー元をコピー先にコピーする
-----------------------------------------
MERGE INTO #saki_table AS A
    USING (
           SELECT
                no    AS no
               ,name  AS name
               ,age   AS age
           FROM
               #moto_table
           ) AS B
    ON
    (
        A.no = B.no
    )
    WHEN MATCHED THEN            --キーが一致した時のUPDATE文
        UPDATE SET
             name = B.name
            ,age = B.age
    WHEN NOT MATCHED THEN        --キーが一致しなかった時のINSERT文
        INSERT
        (
             no
            ,name
            ,age
        )
        VALUES
        (
             B.no
            ,B.name
            ,B.age
        )
;
 
-----------------------------------------
--コピー元とコピー先のデータを参照する
-----------------------------------------
SELECT no, name, age FROM #moto_table ORDER BY no
SELECT no, name, age FROM #saki_table ORDER BY no
 
-----------------------------------------
--コピー元とコピー先のテーブルを削除する
-----------------------------------------
DROP TABLE #moto_table
DROP TABLE #saki_table

#saki_tableテーブルに#moto_tableテーブルの内容がコピーされていますね。
(削除はされません。)

まとめ

MERGE文を使えばINSERTかUPDATEを1行で実行できるようになリ、ソースコードに無駄なIF文を書く必要がなくなるので大変重宝します。

以上、「MERGE文でデータの存在を確認せずにINSERTまたUPDATEを実行する方法」でした。

 

0
システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ