研究這個語句完全是為了偷懶而使用的。
因為在Java寫背景程式的時候,經常會出現存在則UPDATE,不存在則INSERT的需求。
用SQL來完成就是要做3條SQL,用Hibernate寫就就友善咯。
可是我用的是iBatis,就要寫三條了。。
簡單地說一下這個SQL吧。
MERGE INTO target_tbl a
USING new_record b
ON (a.product_id = b.product_id)
WHEN MATCHED THEN
UPDATE SET a.product_name = b.product_name,
a.category = b.category
WHEN NOT MATCHED THEN
INSERT VALUES (b.product_id, b.product_name, b.category)
WHERE b.category != 'BOOKS'
;
merge into 關鍵字後面接着的是目标表,就是最終會改變資料的表。
using後面接的是結果集,可以是一個表,也可以是一條SQL查詢語句。
ON 很顯然是連接配接條件。
在後面的matched 和 NOT matched 的情況下,都和原有的INSERT UPDATE語句差不多,就是省去了寫表名的動作。
又查了一下,merge into還可以附加delete操作呢。
可謂是非常強大,我的使用其實很簡單:
MERGE INTO T T1
USING (SELECT '1001' AS a,2 AS b FROM dual) T2
ON ( T1.a=T2.a)
WHEN MATCHED THEN
UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN
INSERT (a,b) VALUES(T2.a,T2.b);
備注,如果在存儲過程裡面使用了merge語句後,記得一定要COMMIT!!
是的,merge into語句是需要COMMIT的!