MERGE INTO
基本用法
MERGE INTO TABLE1 t1 --要操作的表
USING TABLE2 t2 --條件的表
ON (t1.A=t2.A) --關聯條件
WHEN MATCHED THEN --匹配
UPDATE SET t1.A='abc'--跟新語句
where t1.B = 123
WHEN NOT MATCHED THEN --不匹配
INSERT VALUES('ABC',123); --插入語句
注意點1: on裏面的關聯條件實際效果——每條t2表裏面的數據去t1表裏面匹配
如果關聯條件裏沒有t1.屬性=t2.屬性 就會造成對t1表的全表掃描,查詢就會特別耗時
注意點2:WHEN MATCHED THEN/WHEN NOT MATCHED THEN 可以只存在一個
注意點3:update語句後面可同時執行刪除 UPDATE SET t1.A=”abc” where t1.B = 123 DELETE WHERE t1.C=’XYZ’
以下是實際系統遇到的問題
需求:顧客商品瀏覽記錄表,如果已經插入了,瀏覽次數+1,沒有瀏覽過新增一條
耗時
MERGE INTO 瀏覽記錄表 t1
USING (select count(*) as count from 瀏覽記錄表 t where t.顧客編號 = '123' and t.商品編號 = 'abc' ) t2
ON (count > 0)
WHEN MATCHED THEN
UPDATE SET t1.次數 = t1.次數+1,
where t1.顧客編號 = '123' and t1.商品編號 = 'abc'
WHEN NOT MATCHED THEN
INSERT VALUES('123','abc',1);
--由於瀏覽記錄表數據量特別大 並且關聯條件 ON (count > 0)裏面沒有t1.屬性=t2.屬性,故每條t2的記錄都是對t1表的全表掃描,特別耗時
改進
MERGE INTO 瀏覽記錄表 t1
USING (select '123' as 顧客編號,'abc' as t.商品編號 from dual) t2
ON (t1.顧客編號 = t2.顧客編號 and t1.商品編號 = t2.商品編號)
WHEN MATCHED THEN
UPDATE SET t1.次數 = t1.次數+1,
where t1.顧客編號 = '123' and t1.商品編號 = 'abc'
WHEN NOT MATCHED THEN
INSERT VALUES('123','abc',1);