MERGE [hint] INTO [schema ] table [t_alias]
USING [schema ]{ table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
1)创建一个“比例因子”表
-- Create table create table LF_FACT_GL ( ID NUMBER(10), VALID NUMBER(1) default 1 not null, ZONE_ID NUMBER(10), FACTOR_PG NUMBER(12,6) default 0 not null, FACTOR_QG NUMBER(12,6) default 0 not null, FACTOR_PL NUMBER(12,6) default 0 not null, FACTOR_QL NUMBER(12,6) default 0 not null, CASE_ID NUMBER(10) not null, V_LEVEL NUMBER(10) default 0 ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); comment on column LF_FACT_GL.CASE_ID is '作业编号'; comment on column LF_FACT_GL.V_LEVEL is '电压等级,固定;'; comment on column LF_FACT_GL.ZONE_ID is '分区编号';
2)需求描述
用户可以将某个作业的比例因子导入到另一个作业下。如果另一个作业的比例因子中的“电压等级”和“分区编号” 与操作的作业下的比例因子的电压等级”和“分区编号”分别相等,则做更新操作,否则做插入操作。
3)实现的sql(mybatis)
<insert id="insertOrUpdate" parameterType="map"> MERGE INTO LF_FACT_GL T1 USING (SELECT ID ,VALID ,ZONE_ID , FACTOR_PG,FACTOR_QG ,FACTOR_PL,FACTOR_QL ,CASE_ID ,V_LEVEL FROM LF_FACT_GL WHERE ID IN <foreach collection="iDs" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> ) T2 ON (T1.ZONE_ID = T2.ZONE_ID AND T1.V_LEVEL = T2.V_LEVEL AND T1.CASE_ID = #{caseID} ) WHEN NOT MATCHED THEN INSERT VALUES ( SEQ_PLSF_TBL.NEXTVAL , T2.VALID,T2.ZONE_ID, T2.FACTOR_PG,T2.FACTOR_QG, T2.FACTOR_PL,T2.FACTOR_QL,#{caseID},T2.V_LEVEL ) WHEN MATCHED THEN UPDATE SET T1.VALID = T2.VALID, T1.FACTOR_PG = T2.FACTOR_PG,T1.FACTOR_QG = T2.FACTOR_QG, T1.FACTOR_PL = T2.FACTOR_PL,T1.FACTOR_QL = T2.FACTOR_QL </insert>
map(iDs:String[比例因子编号],aseID:作业编号)
merge 时,on(join 字段)不可以参加update ,否则报错(0n 关联字段不能更新 字段)