我有这段代码,我不知道它会如何工作:
UPDATE Data
SET Processed = 1
FROM Data
JOIN Meters
ON Meters.ServiceAccount = serv_acct
where COALESCE(Processed, 0) = 0
我的问题是关于最后一行!在这种情况下,这条线是否真的如此?
由于我将Processed设置为1,那么它将如何工作:
where COALESCE(Processed, 0) = 0
?
有人能用这种方式解释使用Coalesce的逻辑吗?
这段代码不是我写的。 谢谢
答案 0 :(得分:2)
您的查询是:
UPDATE Data
SET Processed = 1
FROM Data JOIN
Meters
ON Meters.ServiceAccount = serv_acct
where COALESCE(Processed, 0) = 0;
update
查询在进行任何更改之前确定它在上作用的行的数量。因此,最后一行是Processed
为NULL
或0
的行。然后update
为这些行设置Processed
到1
。换句话说,where
子句充当要修改的行的过滤器。具体说法是保留Processed
的值为NULL
或0
的行。
答案 1 :(得分:0)
此处描述了COALESCE
功能:
http://technet.microsoft.com/en-us/library/ms190349.aspx
我认为使用此谓词where COALESCE(Processed, 0) = 0
的原因是过滤所有列Processed
IS NULL或等于0的行。
相反,我会使用use谓词:
UPDATE Data
SET Processed = 1
FROM Data JOIN
Meters
ON Meters.ServiceAccount = serv_acct
where Processed IS NULL OR Processed = 0;
因为他们是SARGable。这意味着Index Seek
。
在Processed
列上应用表达式将强制SQL Server选择[Clustered] Index Scan
。