SQL合并时,目标不匹配与源不匹配有什么区别?

38
“NOT MATCHED BY SOURCE”和“NOT MATCHED BY TARGET”的区别是什么?
例如:当使用“WHEN NOT MATCHED BY SOURCE”,是否意味着目标中存在但源中不存在的记录将被删除?而使用“WHEN NOT MATCHED BY TARGET”是否意味着源中存在但目标中不存在的记录将被插入?

1
这就是他们的意思,但当它们不完全匹配时,你想要做什么取决于你想要实现什么目标。例如,如果在目标表中存在一条记录,但在源表中不存在(未被匹配),这是否意味着你不想在目标表中保留它? - ZLK
基本上,如果匹配并且[TARGET].IS_DELETED = 1,则将它们标记为未删除;或者当不匹配目标(但它们在源中)时,则插入它们;或者当不匹配源且[TARGET].[IS_DELETED] = 0时,则将它们标记为已删除 - 听起来合理吗? - TResponse
2
这里有一个很好的例子和解释:https://technet.microsoft.com/zh-cn/library/bb522522(v=sql.105).aspx - Anton
3个回答

63

当目标表中没有匹配时 - 您应该使用此子句将新行插入目标表中。您插入到表中的行是源表中那些在目标表中没有匹配行的行。

当源数据中没有匹配时 - 如果您想从目标表中删除与源表中不匹配的行


7

需要注意的是,您可能需要进一步限定WHEN NOT MATCHED BY SOURCE语句。

例如,如果TARGET表有一个SOURCE没有的列,并且在上述插入过程中设置了该目标列,则可能需要定义该约束条件:

WHEN NOT MATCHED BY SOURCE AND (TARGET.SomeColumn = yada)


这是值得一提的最佳事情!我每天都会添加数据,而且我必须指定只有在 WHEN NOT MATCHED BY SOURCE AND (targetTable.some_column is null) 时才会删除数据。 - pbou
我们能否更新而不是删除?当源中不存在时,我需要将一个标志更新为“是”,而我不想删除它。如何做到这一点? - TheSacredKiller
@TheSacredKiller 当源数据未匹配且(TARGET.SomeColumn = yada)时,执行更新操作SET T.FOO = 'SOMETHING' (其中T为目标表)。 - Tut

0

您想将目标表与源表匹配,最终使得目标表与源表类似。 当源表中没有匹配项时:关注源表:目标表中存在某些行,在 源表 中找不到它们的等效项。因此,您应该将其删除。 当目标表中没有匹配项时:关注目标表:源表中存在某些行,在目标表 中找不到它们的等效项。因此,您可以将它们插入。


您的回答可以通过提供额外的支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接