利用merge的方法來達成需求
最近遇到一個需求需要匯入資料 對已經存在的資料進行更新
之前想過要用直接透過程式寫if來做 先select count來看看 再去決定要更新還是新增
想一想要寫一堆function 還要一直跟DB連線覺得累累der 乾脆一次請求做完
四處求助跟餵狗之後決定使用Merge的方法來實作
SQL如下
merge into [TargetTable] a
using (select @id id, @parameter1 parameterName) b --[SourceTable]
on a.id = b.id --關聯
when matched then
UPDATE SET parameter1 = @paramete1, parameter2 = @parameter2, parameter3 = @parameter3
when not matched then
INSERT VALUES(@paramete1, @paramete2, @paramete3, @paramete4);
當初一直卡在using這邊 我哪裡來的source table去做merge 原來自己犯蠢 可以自己做一個假table出來merge
在when matched then 是可以再加上條件的 像這樣
when matched and b.prameter1 ='1234' the
這樣必須source table的pramerter1 等於'1234'才會進入下方的敘述句
後來遇到一個奇耙的需求 還要另外判斷一些條件才決定要如何更新
這個需求的情境是 再status = '0'的時候更新某兩個欄位 等於'1'的時候更新某一個欄位
當初我打算這樣寫
merge into [TargetTable] a
using (select @id id, @parameter1 parameter, @status status) b --[SourceTable]
on a.id = b.id --關聯
when matched and b.status = '0' then
UPDATE SET parameter1 = @paramete1, parameter2 = @parameter2
when matched and b.status = '1' then
UPDATE SET parameter3 = @parameter3
when not matched then
INSERT VALUES(@paramete1, @paramete2, @paramete3, @paramete4);
很抱歉 這樣是會報錯誤出來的 沒有辦法寫兩個when matched敘述句的
後來一樣去餵狗想辦法 找到使用case的方法來實作
merge into [TargetTable] a
using (select @id id, @parameter1 parameter, @status status) b --[SourceTable]
on a.id = b.id --關聯
when matched and b.status = '0' then
parameter1 = case when @status = '0' then @parameter1 else a.parameter1 end,
parameter2 = case when @status = '0' then @parameter2 else a.parameter2 end,
parameter3 = case when @status = '1' then @parameter3 else a.parameter3 end
when not matched then
INSERT VALUES(@paramete1, @paramete2, @paramete3, @paramete4);
只要條件不符合 就讓它等於自己就好拉~
符合在更新就好 這樣就達成所要的需求拉!