2017-08-28 111 views
5

我需要更新省份表中每个省代码的描述信息。我正在做的是:有没有办法将多个更新查询合并到一个查询中?

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,只是'内部连接(VALUES( '密西西比州', '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

相关问题