【SQL-Transact】Merge文でInsertとUpdateを使い分け

この記事は約3分で読めます。

基本コードシリーズになりますが、少し複雑なところもあります。

Select/Insert/Updateで代用も可能ですが、それらを1つにまとめる構文になります。

やり方.

MERGE INTO [更新先テーブル名] AS [更新先テーブル変数名]
USING (
    SELECT
        [カラム1] AS [カラム変数名1]
        ,[カラム2] AS [カラム変数名2]
        ,[カラム3] AS [カラム変数名3]
        …
    FROM [更新元テーブル名]
) AS [更新元テーブル変数名]
ON
(
    –結合条件
)
WHEN MATCHED THEN
    UPDATE SET
        
 [更新先テーブル変数名].[更新先カラム1] = [更新元テーブル変数名].[更新元カラム1]
         ,[更新先テーブル変数名].[更新先カラム2] = [更新元テーブル変数名].[更新元カラム2]
         ,[更新先テーブル変数名].[更新先カラム3] = [更新元テーブル変数名].[更新元カラム3]
        …
WHEN NOT MATCHED THEN
    INSERT (
        
 [更新先テーブル変数名].[更新先カラム1] 
        ,
 [更新先テーブル変数名].[更新先カラム2] 
        ,
 [更新先テーブル変数名].[更新先カラム3] 
        …
    ) VALUES (
        
[更新元テーブル変数名].[更新元カラム1]
        ,
[更新元テーブル変数名].[更新元カラム2]
        ,
[更新元テーブル変数名].[更新元カラム3]
    )

コード例.

MARGE文は、テーブルから直接SELECTして更新する方法と、パラメータから取得して単一更新する方法があります。

今回は比較的単純な単一更新のコード例を記載します。

MERGE INTO ALPHABET AS ‘T1’
USING (
    SELECT
        @A AS ‘A’
        ,@B AS ‘B’
        ,@C AS ‘C’
) AS ‘T2’
ON
(
    T1.A = T2.@A
)
WHEN MATCHED THEN
    UPDATE SET
        
 T1.B = T2.B
         ,T1.C = T2.C
WHEN NOT MATCHED THEN
    INSERT (
        A

        ,B

        ,C

    ) VALUES (
        @A

        ,@B

        ,@C

    )

注意点.

1.リンクサーバーでの運用

これは経験則ですが、リンクサーバーだとうまく動作せず、

単純なINSERT&UPDATEだと動作することがありました。

もしうまく動かない等があれば、INSERT&UPDATEもお試しください。

2.結合条件に気を付ける

結合条件には通常 主キーを設定します。

その他復号キーやテーブル定義に合わせた設定が必要です。
MERGE分の最大の肝になります。