2017-08-28 1 views
5

Provincesテーブルの各都道府県コードの説明情報を更新する必要があります。私は何をやっていることである。このように複数の更新クエリを1つのクエリにマージする方法はありますか?

update Provinces 
set Description='Mississippi' 
where Code = 'MS' 

update Provinces 
set Description = 'Maryland' 
where Code = 'MD' 

.... --around 100 more update queries like that. 

、私には良い見ていないコードの重複行は、そこにあります。私は同じ仕事をするためのより良い、より専門的な方法があるのだろうかと思います。助けやアドバイスをいただければ幸いです。

答えて

11

あなたはCASEを使用することができます。

update Provinces 
set Description= CASE code WHEN 'MS' THEN 'Mississippi' 
          WHEN 'MD' THEN 'Maryland' 
          -- ELSE 'some default value' --otherwise NULL 
       END 
where Code IN('MS', 'MD'); 

別のアプローチは、テーブル変数を作成し、UPDATE FROM JOIN構文を使用することです:

DECLARE @t AS (code VARCHAR(10), desc VARCHAR(1000)); 
INSERT INTO @t(code, desc) VALUES ('MS','Mississippi'), ('MD', 'Maryland'); 

UPDATE p 
SET desc = t.desc 
FROM Provinces p 
JOIN @t t 
    ON p.Code = t.code; 
6

case式を使用する代わりにしてcommon table expressionを使用することですtable value constructorと同様にcteに参加してください:

;with ProvinceDescription as (
    select Description, Code 
    from (values 
     ('Mississippi','MS') 
    ,('Maryland','MD') 
    ) v (Description, Code) 
) 
update p 
    set p.Description = pd.Description 
from Provinces p 
    inner join ProvinceDescription pd 
    on p.Code = pd.Code 
where p.Description <> pd.Description; 
+1

するか、CTEをスキップして、ちょうど 'インナーは(参加値(「ミシシッピ」、「MS」)、(「メリーランド州'、' MD '))をProvinceDescription.Code = p.Code'のProvinceDescription(Description、Code)として使用します。 – HABO

+0

@Habo真実、私はそれが可読性を高めると思うので、私はちょうどcteを好む。 – SqlZim

0

あなたのユニークな制約が正しく設定されている場合は、使用することができます。

INSERT INTO Provinces (Description, Code) 
VALUES ('Maryland', 'MD'), ('Mississippi', 'MS') 
ON DUPLICATE KEY UPDATE Description=VALUES(Description), Code=VALUES(Code) 
+2

'Microsoft SQL Server'!=' MySQL'また、OPケースを解決しません。 – lad2025

関連する問題