2
 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.idafter过滤器时,当使用 with语句不匹配where时,我会得到很多空值。看起来不错,但不能正确理解它是如何工作的。 我想知道这两组代码是否等效?in first的行为会像第二组代码中的过滤器一样吗?如果我在第二组代码的 where from 之后省略会发生什么。我只是对此感到困惑idselectmerge
on tb1.id=tb2.idtb1.id=tb2.idselectupdate语句,join 语句使用 with select 会产生空值,但是使用 update 时会发生什么?当我想更新一些表时,我想看看哪些表会受到影响,有时我会对这个空值感到困惑.....我没有任何正式培训,只是在网上寻找并尝试学习,但似乎也是很多事情要考虑。看过这个我也不清楚。

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

4

1 回答 1

1

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

等效于合并的更新的正确形式是:

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;
于 2013-01-30T12:04:29.187 回答