判斷該筆資料是否有存在於特定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,不是單一指令拋傳,而是多筆
指令,因此才會衍生出這樣的做法。
參考連結