2013-08-05 114 views
1

我有這段代碼,我不知道如何將它的工作:SQL服務器合併條件

UPDATE Data 
    SET Processed = 1 
FROM Data 
JOIN Meters 
    ON Meters.ServiceAccount = serv_acct 
where COALESCE(Processed, 0) = 0 

我的問題是,最後一行!在這種情況下,這條線會是真的嗎? 由於我設置處理爲1,那麼將如何工作: where COALESCE(Processed, 0) = 0

任何人都可以這樣解釋使用合併的邏輯嗎?

此代碼不是我自己寫的。 謝謝

回答

2

您所查詢的是:

UPDATE Data 
    SET Processed = 1 
    FROM Data JOIN 
     Meters 
     ON Meters.ServiceAccount = serv_acct 
    where COALESCE(Processed, 0) = 0; 

一個update查詢確定它是作用於之前的任何變化是由行的人口。所以,最後一行是ProcessedNULL0。然後update對於那些行將Processed設置爲1。換言之,where子句充當要修改的行的過濾器。具體說法是保留Processed的值爲NULL0的行。

+0

如果我有這個,會發生什麼情況:where COALESCE(1,0)= 0;這甚至會加入嗎?因爲條件不匹配。 –

+0

@HotlansyHttlandy。 。 。 'coalesce()'返回參數列表中第一個非NULL值的值。所以'coalesce(1,0)= 0'總是假的。在聯接的上下文中,沒有行將匹配。 –

0

COALESCE功能描述如下: http://technet.microsoft.com/en-us/library/ms190349.aspx

我覺得背後使用這個謂詞where COALESCE(Processed, 0) = 0的原因是篩選具有列Processed爲空或等於0

相反,我會所有的行使用使用謂詞:

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