sql实现多行数据比对更新或插入操作

Merge语法
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 关联字段不能更新 字段)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值