SQL-Merge into

  • 652
  • 0
  • 2017-09-19

判斷該筆資料是否有存在於特定Table,無的話則做Insert、有的話則做Delete

自從網路被鎖上後,似乎很久沒在部落格中發表一些新知,匆匆數月過去,其實一直

有很多想要紀錄的事情,一來是給自己建立索引,二來也抱著分享的心態,三來是還

蠻珍惜這個紀錄的習慣,今天分享一個最近使用的語法, "Merge into",

 

情境一:

程式需根據對某Table中的資料做依據,如果該資料存在則做Update or Delete

,否則Insert,通常由兩段SQL完成,1.先select該Table 2.根據結果判斷

使用update or insert,這個用這種比較麻煩的方法還可以達成要的結果,但是

遇到以下情境則會發生問題。

情境二:

SQL Transaction的時候,資料是做批次執行的,如果是針對參數決定SQL的執行

迴圈時,如果用情境一的方式來看該Table中的某筆資料是否存在,則迴圈對該資料

的判斷永遠都是存在就去執行update,為了解決這個問題找到了這個語法解決

MERGE INTO TB1 A USING TB2 B ON (A.ID = B.ID)
WHEN MATCHED THEN

    UPDATE SET A.status = 'YES'
    [DELETE A.ID=B.ID]

WHEN NOT MATCHED THEN

    INSERT (ID, status) VALUES (B.ID, B.status)
    [WHERE  B.status != 'NO';]

如果TB1和TB2符合執行對TB1 Update or Delete,否則做Insert , 另外還可以針對

TB2 insert到TB1的資料做條件過濾,但是有一些限制

限制:

1.這些更新只能針對TB1,也就是如果我要根據達成的條件去更新TB2、TB3則是

無法成立的。

2.使用Delete時,前方一定要有一個Update存在(有點脫褲子放屁的感覺)。

 

最後會有這樣的情境,實在是客戶端的操作flow,不是單一指令拋傳,而是多筆

指令,因此才會衍生出這樣的做法。

 

參考連結