2017-06-21 44 views
2

我有兩個表用於處理標識符更改。用不同的條件更新多個記錄

所以下表是記錄標識符的地方。

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年4月21日,等於從2017年6月2日變化農行ABB XYZ變化JHG &任何標識。

我知道如何在一次更新語句的同時爲一條記錄執行此操作,但我想知道如何同時執行這兩個操作?

update tblSales 
set Id = 'ABB' 
where Id = 'ABC' and DateSale >= '2017-06-02' 

回答

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,但對於一次性工作來說,這是更多工作。

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') 
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 ;