我有两个用于处理标识符更改的表。
因此下表是记录标识符的位置。
tblNewIds
DateFrom OldId NewId
2017-06-02 ABC ABB
2017-04-21 XYZ JHG
下一张表是存储所有日常销售的地方。
tblSales
DateSale Id
2017-01-01 ABC
2017-01-01 XYZ
2017-01-02 ABC
2017-01-02 XYZ
...
2017-06-20 ABC
2017-06-20 XYZ
我想要一个更新tblSales的查询,以便从2017-04-21任何等于XYZ的Id变为JHG&从2017-06-02起将ABC改为ABB。
我知道如何使用下面的更新声明一次为一条记录执行此操作,但我想知道如何同时执行这两项操作?
update tblSales
set Id = 'ABB'
where Id = 'ABC' and DateSale >= '2017-06-02'
答案 0 :(得分:5)
假设id没有链接,那么你可以这样做:
update s
set id = ni.NewId
from tblSales s join
tblNewIds ni
on s.id = ni.oldId and s.DateSale >= ni.DateFrom;
但是,我会谨慎地对数据进行更改。丢失有关原始ID的信息可能会产生意想不到的副作用。
如果ID可以多次更改,我建议只运行update
,直到没有更多更改为止。虽然您可以使用递归CTE在给定时间点构造正确的id,但是一次性工作需要做更多的工作。
答案 1 :(得分:3)
您可以稍微修改当前更新,以使用CASE
表达式,该表达式可以在单个语句中涵盖这两种类型的更新。
update tblSales
set Id = case when Id = 'ABC' and DateSale >= '2017-06-02' then 'ABB'
when Id = 'XYZ' and DateSale >= '2017-04-21' then 'JHG' END
where (Id = 'ABC' and DateSale >= '2017-06-02') or
(Id = 'XYZ' and DateSale >= '2017-04-21')
答案 2 :(得分:0)
UPDATE tblSales
SET id= CASE
WHEN (Id = 'ABC' and DateSale >= '2017-06-02') THEN 'ABB'
WHEN (Id = 'XYZ' and DateSale >= '2017-04-21') THEN 'JHG'
END ;