排除更新SQL Server 2008中的行

时间:2012-04-24 14:25:40

标签: sql sql-server-2008

我正在尝试使用特定信息更新某些选择的行。这意味着我不能做一个简单的更新语句,而是必须指定我想要更改的行以及我将修改它们的值。简而言之,我想更新一个当前为null的日期列与相应的parameterid;因此,以下陈述似乎合乎逻辑:

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

如果我然后更新,那么所有未包含在该列表中的行,即参数id不是'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的经验,我确信我错过了某个关键元素。你能帮忙吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')

第二个通常更快,并且出于锁定原因首选。