2016-11-22 10 views
1

質問1つのクエリで複数のレコードを更新するというアドレスthisを調べました。SQL - 複合キーを使用して1つのクエリで複数のレコードを更新する

一般的な解決策は、私の質問は、これは複合キーに対応するために適合させることができる人である

UPDATE table_name 
SET field_to_update = CASE table_key 
        WHEN key_value1 THEN field_value1 
        WHEN key_value2 THEN feild_value2 
        ELSE feild_to_update 
        END 
WHERE table_key IN(key_value1 , key_value2); 

です。列があるとします。

(id_1, id_2, column_to_update) 

id_1とid_2は複合主キーを形成します。

私の問題は、id列の1つが特定のクエリに対して一定であるという事実によって簡単になりました。例えば、私は

UPDATE table_name 
SET field_to_update = CASE (key1, key2) 
       WHEN (1,1) THEN field_value1 
       WHEN (2,1) THEN feild_value2 
       ELSE feild_to_update 
       END 
WHERE (key1, key2) IN ((1, 1) , (2, 1)); 

の線に沿って何かを

を必要とする誰もが助けてくださいことはできますか?

+0

場合に上書きすることができます2オペランドです – scaisEdge

+0

私は知っていますが、私は何をしたいのかを知りたいと思っていました。それでも私は気にしない全く異なる構文が必要です。 –

+0

'CASE'の代わりの形式があります。 'の場合[条件] THEN [時間] [条件2] THEN [時間2] .... ELSE .... END'。 – Uueerdo

答えて

1

場合のタプルの使用はケース許可されていませんが、あなたの場合のようにタプルを使用する場合は2つのオペランド

であるため、「オペランドが1列(複数可)を含まなければならない」 エラーを持っている唯一のオペランドを許可しますしかし、あなたはあなたのケースでのようにタプルを使用する場合は、エラー「オペランドが1列(複数可)を含まなければならない」理由を持っている唯一のオペランドに許可する一部の連結などの操作(および暗黙的な変換)

UPDATE table_name 
    SET field_to_update = CASE concat(key1, key2) 
       WHEN concat(1,1) THEN field_value1 
       WHEN concat(2,1) THEN feild_value2 
       ELSE feild_to_update 
       END 
    WHERE concat(key1, key2) IN (concat(1, 1) , concat(2, 1)); 
+0

完璧なソリューションです。感謝 –

+0

@コナーBishop。おかげで偽陽性を避けるために正しい操作を使用するようにしてください(2つの異なる値が同じになったとき) – scaisEdge

+0

@scaisEdgeこれを行う良い方法は通常、2つの値の間にありそうな文字列を追加することです。たとえば、数字の場合 'CASE CONCAT(key1、 '|'、key2)WHEN '1 | 1' THEN ... ' – Uueerdo

関連する問題