2012-04-24 89 views
3

我試圖用特定信息更新某些行的選擇。這意味着我不能做一個簡單的更新語句,而是必須指定我想要更改的行和我將修改它們的值。簡而言之,我想更新一列相對於相應parameterid當前爲空的日期;因此,下面的語句似乎是合乎邏輯:排除更新SQL Server 2008中的行

UPDATE contactparameter 
SET effectiveto = CASE parameterid  
When '2887' Then '13-Aug-2012' 
When '2896' Then '21-Feb-2012' 
When '3008' Then '28-Oct-2012' 
When '3272' Then '18-Jan-2013' 
END 

如果我再更新,所有未包括在該列表中的行,即其中parameterids不是「2887」,「2896」的所有行,「3008」或' 3272',然後被清空。我曾嘗試選擇我想在一個子查詢中更新的行:

UPDATE contactparameter 
SET effectiveto = CASE parameterid 
When '2887' Then '13-Aug-2012' 
When '2896' Then '21-Feb-2012' 
When '3008' Then '28-Oct-2012' 
When '3272' Then '18-Jan-2013' 
END 
WHERE exists 
    (SELECT cp.parameterid 
     from contact c 
     INNER JOIN contactparameter cp on c.serialnumber = cp.serialnumber 
     WHERE cp.effectivefrom is not null 
     and cp.effectiveto is null) 

但是,這不正是相同。我在使用SQL方面還相當缺乏經驗,並且我確信我缺少某個關鍵元素。能否請你幫忙?

回答

1

這應做到:

UPDATE contactparameter 
SET effectiveto = CASE parameterid 
    When '2887' Then '13-Aug-2012' 
    When '2896' Then '21-Feb-2012' 
    When '3008' Then '28-Oct-2012' 
    When '3272' Then '18-Jan-2013' 
END 
from contact c 
INNER JOIN contactparameter cp on c.serialnumber = cp.serialnumber 
WHERE cp.effectivefrom is not null 
and cp.effectiveto is null 
+0

謝謝您的回覆。這似乎與我的第二個解決方案相同,這會導致所有行都被更新。你知道這是爲什麼嗎? – user1353787 2012-04-25 14:28:35

+0

我已經嘗試使用一個額外的參數 - cp.parametercategory這限制行更新到我想要的。感謝您的解決方案。 – user1353787 2012-04-25 15:18:43

1

兩種方法可以做到這一點,

#1,請指定CASE表達式的ELSE子句只返回它已經具有相同的值,否則它返回NULL所有非比賽:

UPDATE contactparameter 
SET effectiveto = CASE parameterid  
When '2887' Then '13-Aug-2012' 
When '2896' Then '21-Feb-2012' 
When '3008' Then '28-Oct-2012' 
When '3272' Then '18-Jan-2013' 
Else effectiveto 
END 

或者,#2,使用WHERE子句僅匹配也有符合你的CASE表達式的那些行:

UPDATE contactparameter 
SET effectiveto = CASE parameterid  
When '2887' Then '13-Aug-2012' 
When '2896' Then '21-Feb-2012' 
When '3008' Then '28-Oct-2012' 
When '3272' Then '18-Jan-2013' 
END 
WHERE parameterid IN('2887','2896','3008','3272') 

第二個通常更快,因鎖定原因而優先選擇。

+0

感謝您的回覆。但是,執行第一個解決方案時,會導致所有行都被更新。使用第二種解決方案時,我收到以下消息:「從字符串中轉換日期和/或時間時,消息241,級別16,狀態1,行1轉換失敗。」 – user1353787 2012-04-25 14:26:06

+0

對不起,第二個查詢已被修復。是的,第一個查詢將更新與原始查詢相同的行,但不會將不匹配的行刪除。 – RBarryYoung 2012-04-25 14:35:34