我认为它是将记录从target
和分支source
到不同的执行路径。
下面我举一个简单的数字列表的例子。我使用 afull join
来表示合并并case
表示“分支”。
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
但这种情况并非如此。
当一条记录已经是matched
或者not matched by source
之后,人们可以进一步对数据进行谓词来决定它应该是delete
d 还是update
d。这是通过为 MERGE 中所示的附加子句提供两个相同的“分支”来完成AND
的。example d