MERGEステートメントの概要とSQLServerデータの変更
MERGEステートメントは、葯から一致した値に基づいて1つのテーブルを変更するために使用されます。挿入、更新、および削除操作を1つのステートメントに組み合わせるために使用できます。この記事では、MERGEステートメントの使用方法について説明します。いくつかのベストプラクティス、制限、およびまとめについて、いくつかの例を挙げて説明します。
これは、一連の記事の5番目の記事です。最初に、SQLServerデータ変更ステートメントの概要を読むことから始めることができます。
このレッスンのすべての例は、Microsoft SQL Server ManagementStudioとAdventureWorks2012データベースに基づいています。これらの無料ツールの使用を開始するには、ガイドを使用してSQLServerの使用を開始します
始める前に
この記事では例としてAdventureWorksデータベースを使用していますが、作成することにしました。対象となる概念をわかりやすく説明するためにデータベース内で使用するいくつかのサンプルテーブル。実行する必要のあるスクリプトはここにあります。 MERGEに関連する特別なセクションがあることに注意してください。
基本構造
MERGEステートメントは、INSERT、DELETE、およびUPDATE操作を1つのテーブルに結合します。仕組みを理解すると、3つのステートメントすべてを個別に使用してデータを同期することで、手順が簡素化されることがわかります。
以下は、マージステートメントの一般化された形式です。
MERGE targetTableUsing sourceTableON mergeConditionWHEN MATCHEDTHEN updateStatementWHEN NOT MATCHED BY TARGETTHEN insertStatementWHEN NOT MATCHED BY SOURCETHEN deleteStatement
マージステートメントは、sourceTableとtargetTableの2つのテーブルを使用して機能します。 targetTableは、sourceTable内に含まれるデータに基づいて変更されるテーブルです。
2つのテーブルはmergeConditionを使用して比較されます。この条件は、sourceTableの行をtargetTableに一致させる方法を指定します。 INNER JOINSに精通している場合は、これを行の照合に使用される結合条件と考えることができます。
通常、主キーなどの一意の識別子と照合します。ソーステーブルがNewProductであり、ターゲットProductMasterであり、両方のProductIDの主キーである場合、使用する適切なマージ条件は次のようになります。
NewProduct.ProductID = ProductMaster.ProductID
マージ条件の結果3つの状態のいずれか:MATCHED、NOT MATCHED、またはNOT MATCHED BYSOURCE。
マージ条件
さまざまな条件の意味を確認しましょう:
MATCHED –これらは一致条件を満たす行です。これらは、ソーステーブルとターゲットテーブルの両方に共通です。この図では、それらは緑色で示されています。合併ステートメントでこの条件を使用すると、 sourceTable列の値でターゲット行の列を更新するのとほとんど同じです。
NOT MATCHED –これはNOT MATCHED BYTARGETとも呼ばれます。これらは、ターゲットテーブルのどの行とも一致しなかったソーステーブルの行です。これらの行は、上の青い領域で表されます。ほとんどの場合、ソース行をtargetTableに追加する必要があることを推測するために使用できます。
ソースと一致しません–これらは、ソースレコードと一致しなかったターゲットテーブルの行です。これらはオレンジ色の領域の行です。 targetTableデータをソースと完全に同期することが目的の場合は、この一致条件を使用して行を削除します。
これがどのように機能するかを理解できない場合は、マージ条件が次のようになっていると考えてください。結合条件。緑のセクションのROWSは、マージ条件に一致する行を表します。青のセクションの行は、SourceTableにあるが、ターゲットにはない行です。オレンジ色のセクションの行は、ターゲットでのみ見つかった行です。
これらの一致するシナリオを指定すると、追加、削除、更新のアクティビティを1つのステートメントに簡単に組み込んで、2つの間の変更を同期できます。テーブル。
例を見てみましょう。
MERGEの例
esqlProductSourceに加えられた変更をesqlProductTargetと同期することが目標であると仮定しましょう。これら2つのテーブルの図を次に示します。
注:この例のために、説明したスクリプトを実行しました。 esqlProductSourceとesqlProductTargetの2つのテーブルを作成してデータを設定するための概要で。
MERGEステートメントを作成する前に、UPDATE、INSERT、およびDELETEステートメントを使用してテーブルを同期して変更および追加する方法を見てみましょう。 、およびターゲットテーブルの行を削除します。
これを個別に行う方法を確認したら、1つの操作に組み合わせて確認する方が理にかなっていると思います。
UPDATEを使用して変更を同期するあるテーブルから次のテーブルへ
製品ソースで変更された値でターゲットテーブルを更新するには、UPDATEステートメントを使用できます。 ProductIDは両方のテーブルの主キーであるため、テーブル間の行に一致する最適な選択肢になります。
ソース列を使用してターゲットテーブルの列値を更新する場合は、次の更新ステートメントを使用して更新できます
UPDATE esqlProductTargetSET Name = S.Name, ProductNumber = S.ProductNumber, Color = S.ColorFROM esqlProductTarget T INNER JOIN esqlProductSource S ON S.ProductID = T.ProductID
このステートメントは、esqlProductTargetの列を、esqlProductSourceで見つかった対応する列値で更新してproductIDと一致させます。
1つのテーブルで見つかったが他のテーブルでは見つからなかったINSERT行
次に、どのように処理するかを見てみましょう。製品ターゲットに挿入する必要があるソーステーブルの行を識別できます。これを行うには、サブクエリを使用して、ターゲットにないソーステーブルの行を検索できます。
INSERT INTO esqlProductTarget (ProductID, Name, ProductNumber, Color)SELECT S.ProductID, S.Name, S.ProductNumber,
read more