在这种情况下,为什么我需要SQL合并的“匹配”部分?

时间:2015-07-21 10:10:30

标签: sql merge sql-server-2012

请考虑以下事项:

merge into T t1
using (select ID,Col1 from T where ID = 123) t2
on 1 = 0
when not matched then insert (Col1) values (t2.Col1);

Cominig来自编程背景,对我而言,这意味着:

“评估false(即1 = 0),当它为false时(即所有时间),请插入。”

是否可以省略匹配条件? 是因为我选择的where条件我在这里感到困惑吗?是否应将此条件移至on

注:

由于output的限制,我无法使用insert。我需要将此合并的结果输出到临时表中,原因超出了我所要求的范围。

1 个答案:

答案 0 :(得分:4)

answer you've linked to in the comments中,我希望明确表示,我们滥用 MERGE声明。

您在此处显示的查询可以简单地替换为:

insert into T(Col1) select Col1 from T where ID = 123

但是,如果您希望能够添加OUTPUT clause,并且OUTPUT子句需要引用源表中新插入的数据数据,你不能在INSERT声明中写下这样的条款。

因此,我们改为使用MERGE语句,但不是用于其预期目的。完整的目的是强制它执行INSERT并编写我们的OUTPUT条款。

如果我们检查MERGE的文档,我们会看到我们可以指定执行INSERT的唯一子句在WHEN NOT MATCHED [BY TARGET]子句中 - {{1} }和WHEN MATCHED子句,我们唯一的选择是WHEN NOT MATCHED BY SOURCEUPDATE

因此,我们必须编写DELETE以使匹配始终失败 - 最简单的方法是在MERGE 1 时进行匹配 - 希望永远不会。

1 由于SQL Server不支持boolean literals