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

时间:2017-08-28 12:04:37

标签: sql sql-server sql-server-2008 tsql

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

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

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

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

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:6)

使用case表达式的另一种方法是使用带有common table expressiontable 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;  

答案 2 :(得分:0)

如果您正确设置了唯一约束,则可以使用:

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