我需要更新省份表中每个省份代码的描述信息。我在做的是:
update Provinces
set Description='Mississippi'
where Code = 'MS'
update Provinces
set Description = 'Maryland'
where Code = 'MD'
.... --around 100 more update queries like that.
通过这种方式,会出现重复的代码行,这对我来说并不好看。我想知道是否有更好,更专业的方式来完成同样的任务。任何帮助或建议将不胜感激。
答案 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 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;
答案 2 :(得分:0)
如果您正确设置了唯一约束,则可以使用:
INSERT INTO Provinces (Description, Code)
VALUES ('Maryland', 'MD'), ('Mississippi', 'MS')
ON DUPLICATE KEY UPDATE Description=VALUES(Description), Code=VALUES(Code)