次の例では、T-SQLを使用してSQLServerの2つのテーブルをマージします。 VALUES
を使用します ソーステーブルとしてのテーブル値コンストラクタ。
次のようなテーブルを作成するとします。
CREATE TABLE Idiots (
IdiotId int IDENTITY(1,1) NOT NULL,
FirstName varchar(50),
LastName varchar(50)
);
INSERT INTO Idiots VALUES
('Peter', 'Griffin'),
('Homer', 'Simpson'),
('Ned', 'Flanders');
SELECT * FROM Idiots;
結果:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
そして、マージ操作を実行したいとします。新しい行を挿入したいのですが、ソースの値と一致する値の行がすでに存在する場合は、代わりに(新しい行を挿入する代わりに)既存の行を更新します。
私たちはこのようにそれを行うことができます:
DECLARE @Changes TABLE(Change VARCHAR(20));
MERGE INTO Idiots AS Target
USING ( VALUES
(3, 'Ned', 'Okily Dokily!'),
(4, 'Lloyd','Christmas'),
(5, 'Harry', 'Dunne')
) AS Source ( IdiotId, FirstName, LastName )
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;
SELECT Change, COUNT(*) AS Count
FROM @Changes
GROUP BY Change;
結果:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
2つの新しい行が挿入され、1つが更新されました。
ここでは、テーブル値コンストラクター(VALUES
)を使用しました )テーブルの新しい値を指定します。
この場合、IdiotId
を確認しました およびFirstName
列。基本的に、IDと名が同じである場合、新しい行を挿入するのではなく、既存の行を更新する必要があります。
WHEN MATCHED
を使用しました VALUES
からのデータが発生したときに何が起こるかを指定します 句は、ターゲットテーブルのデータと一致します。この場合、VALUES
からの新しいデータで行を更新するだけです。 。
WHEN NOT MATCHED BY TARGET
を使用しました 一致するものがない場合に何が起こるかを指定します。この場合、新しいデータを含む新しい行を挿入します。
@Changes
という変数も使用しました マージ操作の出力を表示します。 OUTPUT
を使用しました このためのマージ操作の後の句。これが、上記の結果の表を示したものです。
これで、ターゲットテーブルをチェックして、マージ操作がターゲットテーブルに与えた影響を確認できます。
SELECT * FROM Idiots;
結果:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
馬鹿番号3(Ned)の名前が更新されていることがわかります。また、2つの新しい馬鹿がテーブルに追加されたことがわかります(ロイドとハリー)。