Why do I need the 'match' part of a SQL merge, in this scenario?

丶灬走出姿态 提交于 2019-12-11 20:09:38

问题


Consider the following:

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 from a programming background, to me this translates to:

"Evaluate false (i.e. 1 = 0), and when it is false (i.e. all the time), insert."

Is it not possible to just omit the match condition? Is it because of my select's where condition that I'm confused here? Should this condition be moved to the on?

NOTE:

Due to restrictions with output, I cannot use insert. I need to output the results of this merge into a temporary table for reasons outside of the scope of what I'm asking.


回答1:


In the answer you've linked to in the comments, as I've hopefully made clear, we are abusing the MERGE statement.

The query you've shown here could trivially be replaced by:

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

However, if you want to be able to add an OUTPUT clause, and that OUTPUT clause needs to reference both the newly inserted data and data from the source table, you're not allowed to write such a clause on an INSERT statement.

So, we instead use a MERGE statement, but not for its intended purpose. The entire purpose is to force it to perform an INSERT and write our OUTPUT clause.

If we examine the documentation for MERGE, we see that the only clause in which we can specify to perform an INSERT is in the WHEN NOT MATCHED [BY TARGET] clause - in both the WHEN MATCHED and WHEN NOT MATCHED BY SOURCE clauses, our only options are to UPDATE or DELETE.

So, we have to write the MERGE such that matching always fails - and the simplest way to do that is to say that matching should occur when 1 = 01 - which, hopefully, is never.


1Since SQL Server doesn't support boolean literals



来源:https://stackoverflow.com/questions/31536143/why-do-i-need-the-match-part-of-a-sql-merge-in-this-scenario

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!