有没有办法将多个更新查询合并到一个查询中?

Era*_*nli 5 sql t-sql sql-server sql-server-2008

我需要更新省份表中每个省份代码的描述信息.我在做的是:

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

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

.... --around 100 more update queries like that.
Run Code Online (Sandbox Code Playgroud)

通过这种方式,存在重复的代码行,这对我来说并不好看.我想知道是否有更好,更专业的方式来完成同样的任务.任何帮助或建议将不胜感激.

Luk*_*zda 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');
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建表变量并使用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;
Run Code Online (Sandbox Code Playgroud)


Sql*_*Zim 6

使用case表达式的另一种方法是使用带有表值构造函数公用表表达式并连接到类似的表达式: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;  
Run Code Online (Sandbox Code Playgroud)