target
と の両方からsource
別の実行パスにレコードを分岐するという観点から考えます。
以下に、単純な数字のリストの例を示します。full join
マージcase
を表し、「分岐」を表すために a を使用します。
DECLARE @source TABLE ( i INT, c CHAR(1) )
DECLARE @target TABLE ( i INT )
INSERT INTO @source ( i )
VALUES (1), (2), (3), (4), (5)
INSERT INTO @target ( i )
VALUES (1), (2), (3), (6), (7)
SELECT
[source] = s.i,
[target] = t.i,
[branch] = CASE WHEN t.i IS NULL THEN 'not matched by target'
WHEN s.i IS NULL THEN 'not matched by source'
ELSE 'matched' END,
[possible action] = CASE WHEN t.i IS NULL THEN 'insert into target'
WHEN s.i IS NULL THEN 'update target or delete from target'
ELSE 'update target or delete from target' END
FROM @source s
FULL JOIN @target t ON t.i = s.i
これにより、次のものが生成されます
source target branch possible action
----------- ----------- --------------------- -----------------------------------
1 1 matched update target or delete from target
2 2 matched update target or delete from target
3 3 matched update target or delete from target
4 NULL not matched by target insert into target
5 NULL not matched by target insert into target
NULL 6 not matched by source update target or delete from target
NULL 7 not matched by source update target or delete from target
それで
- ソース レコードがターゲット ( ) に一致しない場合、
not matched by target
これらはinsert
ターゲットに追加できます
- ターゲット レコードがソース ( ) に一致しない場合
not matched by source
、対応するターゲット レコードをupdate
d またはdelete
d にすることができます。参照するソース レコードがないことは明らかです。
- ソース レコードがターゲット レコードと一致した場合 (
matched
)、ターゲット レコードもupdate
d またはdelete
d になる可能性がありますが、こことは異なりnot matched by source
、ソースからのレコードも取得します。
更新と削除については、結合を使用したり、「ブランチ」内でソースをターゲットに、ターゲットをターゲットなどに関連付けたりする必要はありません。これらの関係はすでに解決されており、まるであなたが個人記録。
たとえば、次のように更新する必要があると思うかもしれません
Update t
Set t.col = s.col
From target t
Join source s On s.id = t.id
しかし、そうではありません。
レコードが or のいずれかである場合matched
、データをさらに述語して、 d またはdnot matched by source
のどちらにするかを決定できます。これは、MERGEの に示されているように、2 つの同じ「ブランチ」に追加の句を提供することによって行われます。delete
update
AND
example d