3

特定の情報で特定の行の選択を更新しようとしています。つまり、単純な update ステートメントを実行することはできず、代わりに、変更する行とそれらを修正する値を指定する必要があります。つまり、現在 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 の使用にかなり不慣れで、どこかで重要な要素が欠けていると確信しています。助けていただけますか?

4

2 に答える 2

1

これを行う2つの方法、

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

2つ目は通常、より高速で、ロックの理由から優先されます。

于 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 に答える