1. 程式人生 > >Oracle存在則更新,不存在則插入應用-merge

Oracle存在則更新,不存在則插入應用-merge

Oracle在9i引入了merge命令,

通過這個merge你能夠在一個SQL語句中對一個表同時執行inserts和updates操作. 當然是update還是insert是依據於你的指定的條件判斷的,Merge into可以實現用B表來更新A表資料,如果A表中沒有,則把B表的資料插入A表. MERGE命令從一個或多個數據源中選擇行來updating或inserting到一個或多個表

MERGE INTO table_name alias1 
USING (table|view|sub_query) alias2
ON (join condition) 
WHEN MATCHED THEN 
    UPDATE table_name 
    SET col1 = col_val1, 
           col2 = col_val2 
WHEN NOT MATCHED THEN 
    INSERT (column_list) VALUES (column_values);

在alias2中Select出來的資料,每一條都跟alias1進行 ON (join condition)的比較,如果匹配,就進行更新的操作(Update),如果不匹配,就進行插入操作(Insert)。

因此,嚴格意義上講,“在一個同時存在Insert和Update語法的Merge語句中,總共Insert/Update的記錄數,就是Using語句中alias2的記錄數。”

例項:

T有a、b兩個欄位 a是主鍵。現在有記錄(1001,2)要儲存到T中,T中如果已經存在則更新欄位b,沒有插入。

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);

例項:

mybatist 中的sql:

  <insert id="mergeInto"  >

    MERGE INTO CATEGORY_EXPERT_GRADE  T1
    USING ( select ${categoryFk} as a, ${expertFk} as b  FROM dual) T2
    ON ( T1.CATEGORY_FK=T2.a and T1.EXPERT_FK=T2.b)
    WHEN MATCHED THEN
    UPDATE SET T1.GRADE = #{grade,jdbcType=VARCHAR}
    WHEN NOT MATCHED THEN
    insert   (PK, CATEGORY_FK, EXPERT_FK,GRADE, SAVE_DATE, FLAG,EXTEND1, EXTEND2, EXTEND3)
    values (Sequence_Shzj.nextval, #{categoryFk,jdbcType=DECIMAL}, #{expertFk,jdbcType=DECIMAL},
    #{grade,jdbcType=VARCHAR}, #{saveDate,jdbcType=DATE}, #{flag,jdbcType=DECIMAL},
    #{extend1,jdbcType=VARCHAR}, #{extend2,jdbcType=VARCHAR}, #{extend3,jdbcType=VARCHAR}
    )

  </insert>