更新具有不同where条件的多个记录

时间:2017-06-21 14:07:54

标签: sql sql-server

我有两个用于处理标识符更改的表。

因此下表是记录标识符的位置。

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'

3 个答案:

答案 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 ;