请考虑以下事项:
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
。我需要将此合并的结果输出到临时表中,原因超出了我所要求的范围。
答案 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 SOURCE
或UPDATE
。
因此,我们必须编写DELETE
以使匹配始终失败 - 最简单的方法是在MERGE
1 时进行匹配 - 希望永远不会。
1 由于SQL Server不支持boolean literals