結合ステートメントに慣れていない場合は、そこから始める必要があります。結合がどのように機能するかを理解することが残りの鍵です。結合に慣れたら、一致する行または一致しない行に対して何をすべきかについての指示を含む完全な結合と考えると、マージを理解するのが最も簡単になります。
提供されているコード サンプルを使用して、テーブル Commissions_history を見てみましょう。
| Amount | Request | <other fields> |
--------------------------------------------
| 12.00 | 1234 | <other data> |
| 14.00 | 1235 | <other data> |
| 15.00 | 1236 | <other data> |
merge ステートメントは、「ターゲット」と呼ばれるテーブルと、「ソース」と呼ばれるテーブル (または CTE のようなテーブルに論理的に非常に類似した結果セット) を返す式との間の完全な結合を作成します。
与えられた例では、変数をソースとして使用しています。これは、ユーザーによって設定されているか、パラメーターとして渡されていると想定しています。
DECLARE @Amount Decimal = 18.00;
DECLARE @Request Int = 1234;
MERGE dbo.commissions_history AS target
USING (SELECT @amount, @requestID) AS source (amount, request)
ON (target.request = source.request)
結合と考えると、次の結果セットが作成されます。
| Amount | Request | <other fields> | Source.Amount | Source.Request |
------------------------------------------------------------------------------
| 12.00 | 1234 | <other data> | 18.00 | 1234 |
| 14.00 | 1235 | <other data> | null | null |
| 15.00 | 1236 | <other data> | null | null |
一致が見つかったという条件でターゲットに何をすべきかについて与えられた指示を使用する。
WHEN MATCHED THEN
UPDATE SET amount = source.amount
結果のターゲット テーブルは次のようになります。リクエスト 1234 の行は 18 に更新されます。
| Amount | Request | <other fields> |
--------------------------------------------
| 18.00 | 1234 | <other data> |
| 14.00 | 1235 | <other data> |
| 15.00 | 1236 | <other data> |
一致が見つかったため、他に何も起こりません。しかし、ソースからの値はこのようなものだったとしましょう。
DECLARE @Amount Decimal = 18.00;
DECLARE @Request Int = 1239;
結果の結合は次のようになります。
| Amount | Request | <other fields> | Source.Amount | Source.Request |
------------------------------------------------------------------------------
| 12.00 | 1234 | <other data> | null | null |
| 14.00 | 1235 | <other data> | null | null |
| 15.00 | 1236 | <other data> | null | null |
| null | null | null | 18.00 | 1239 |
一致する行がターゲットで見つからなかったため、ステートメントは他の句を実行します。
WHEN NOT MATCHED THEN
INSERT (request, amount)
VALUES (source.request, source.amount);
ターゲット テーブルは次のようになります。
| Amount | Request | <other fields> |
--------------------------------------------
| 12.00 | 1234 | <other data> |
| 14.00 | 1235 | <other data> |
| 15.00 | 1236 | <other data> |
| 18.00 | 1239 | <other data> |
マージ ステートメントの真の可能性は、ソースとターゲットが両方とも大きなテーブルである場合です。単一の単純なステートメントで各行に対して大量の更新および/または挿入を実行できるためです。
最後のメモ。not matched
デフォルトは完全な句ですが、デフォルト句の代わりに、またはデフォルト句に加えてnot matched by target
指定できることに注意してください。merge ステートメントは、両方のタイプの不一致 ( on 句で定義されているようにnot matched by source
、ソース内のレコードがターゲット内にない、またはターゲット内のレコードがソース内にない) をサポートします。 MSDN で完全なドキュメント、制限、および完全な構文を見つけることができます。