MERGE INTO 詳解

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); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章