3

我正在尝试使用特定信息更新某些行选择。这意味着我不能执行简单的更新语句,而是必须指定我想要更改的行以及我将修改它们的值。简而言之,我想根据相应的 parameterid 更新当前为 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'   
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 方面仍然相当缺乏经验,而且我确信我在某处遗漏了一个关键元素。能否请你帮忙?

4

2 回答 2

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')

出于锁定原因,第二个通常更快且更受欢迎。

于 2012-04-24T14:31:32.840 回答
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
于 2012-04-24T14:28:25.210 回答