merge和join语句有什么区别?

时间:2012-11-26 17:47:23

标签: sql-server-2008 join merge

 1.
 MERGE tbl AS target
USING tb2  AS source 
ON (target.id = source.id)

WHEN MATCHED and source.price >450 
then  
UPDATE SET TARGET.price = SOURCE.price, 
TARGET.group = SOURCE.group 

 2.
 update tb1 
set 
tb1.price=tb2.price, 
tb1.group=tb2.group from tb2 
left join tb1 on tb1.id =tb2.id 
where tb1.id =tb2.id 
and tb1.price>450

我对上述两种代码感到困惑。在第二个代码集上,当我在tb1.id=tb2.id过滤器之后不使用where时,当idselect语句不匹配时,我会得到大量空值。 merge似乎很好,但不能正确理解它是如何工作的  我想知道这两组代码是否相同?第一组代码中的on tb1.id=tb2.id首先表现得像过滤器吗?如果我在第二组代码之后省略tb1.id=tb2.id会发生什么。我很困惑,使用这个selectupdate语句,join语句使用select生成空值,但使用update时会发生什么?什么时候我想要更新一些表格,我想看看哪些表格会受到影响,有时候我会对这些空白感到困惑.....我没有任何正式的培训,只是在网上寻找并尝试学习但似乎也是要考虑很多事情。 见过this one我也不清楚。

没有。两个表上的行不相同,tb1大于tbl2。

1 个答案:

答案 0 :(得分:1)

第二个语句中的问题是LEFT连接。 LEFT OUTER JOIN的缩写 - 即对于tb1中tb2中没有匹配的任何行,“匹配”tb2值将为null。

相当于合并的更新的正确形式是:

update tb1 set 
    price = source.price, 
    group = source.group 
from tb2 as source
    join tb1 as target 
        on (target.id = source.id)
where source.price > 450;