MW211 EXIT

devlog
MSSQL/マッチング・後編(Ⅱ)
2015年05月14日
MERGE文はあきらめきれないあなたに。

【案1】CASE文で差分がなければ現状維持の値を代入する
┌──────────────────────────────────────┐
│MERGE INTO [旧表]                                                           │
│    USING [新表]                                                            │
│       ON [新表].[キー] = [旧表].[キー]                                     │
│    WHEN MATCHED THEN                                                       │
│        UPDATE SET [列]       = [新表].[列],                                │
│                   [更新日時] = CASE                                        │
│                                  WHEN [旧表].[列] = [新表].[列] THEN       │
│                                    [旧表].[更新日時]                       │
│                                  ELSE                                      │
│                                    getdate()                               │
│                                END                                         │
│    WHEN NOT MATCHED BY TARGET THEN                                         │
│        INSERT (                                                            │
│                [キー],                                                     │
│                [列],                                                       │
│                [更新日時]                                                  │
│            ) VALUES (                                                      │
│                [新表].[キー],                                              │
│                [新表].[列],                                                │
│                getdate()                                                   │
│            );                                                              │
└──────────────────────────────────────┘

【案2】まず重複するものを除いたからMERGEを行う
┌──────────────────────────────────────┐
│MERGE INTO [旧表]                                                           │
│    USING (                                                                 │
│        SELECT *                                                            │
│            FROM [新表]                                                     │
│            WHERE NOT EXISTS (                                              │
│                      SELECT *                                              │
│                          FROM [旧表]                                       │
│                          WHERE [旧表].[キー] = [新表].[キー]               │
│                            AND [旧表].[列]   = [新表].[列]                 │
│                  )                                                         │
│    ) AS [新表]                                                             │
│       ON [新表].[キー] = [旧表].[キー]                                     │
│    WHEN MATCHED THEN                                                       │
│        UPDATE SET [列]       = [新表].[列],                                │
│                   [更新日時] = getdate()                                   │
│    WHEN NOT MATCHED BY TARGET THEN                                         │
│        INSERT (                                                            │
│                [キー],                                                     │
│                [列],                                                       │
│                [更新日時]                                                  │
│            ) VALUES (                                                      │
│                [新表].[キー],                                              │
│                [新表].[列],                                                │
│                getdate()                                                   │
│            );                                                              │
└──────────────────────────────────────┘

【案2】が拡張性があってよさげだ。

※NULL値の比較に注意
分類:MSSQL