做多行保存与更新的时候需要对属于某个主键的进行更新与插入需要用merge into
这是与mybatis结合使用的
MERGE INTO REAL_TAP_WATER_FIX HIS
USING (SELECT *
FROM (SELECT WATERSUPPLY,
WATERDEMAND,
COMPLAINTNUM,
WARNINGNUM,
REPAIRAREA,
PAUSESUPPLYAREA,
EVENTNUM,
STATDATE,
ROW_NUMBER() OVER(PARTITION BY STATDATE ORDER BY WATERSUPPLY) RN
FROM
<foreach
collection="list"
item="item"
index="index"
open="("
close=")"
separator="union all">
select
#{item.waterSupply} as waterSupply,
#{item.waterDemand} as waterDemand ,
#{item.complaintNum} as complaintNum,
#{item.warningNum} as warningNum,
#{item.repairArea} as repairArea,
#{item.pauseSupplyArea} as pauseSupplyArea,
#{item.eventNum} as eventNum,
to_date(to_char(#{item.statDate},'yyyy-MM-dd'),'yyyy-MM-dd') as statDate
from
dual
</foreach>
)
WHERE RN = 1) SRC
ON (HIS.STAT_DATE = SRC.STATDATE)
WHEN MATCHED THEN
UPDATE
SET HIS.COMPLAINT_NUM = SRC.COMPLAINTNUM,
HIS.WATER_SUPPLY = SRC.WATERSUPPLY,
HIS.WARNING_NUM = SRC.WARNINGNUM,
HIS.WATER_DEMAND = SRC.WATERDEMAND,
HIS.REPAIR_AREA = SRC.REPAIRAREA,
HIS.PAUSE_SUPPLY_AREA = SRC.PAUSESUPPLYAREA,
HIS.EVENT_NUM = SRC.EVENTNUM,
HIS.UPDATE_TIME = SYSTIMESTAMP
WHEN NOT MATCHED THEN
INSERT
(WATER_SUPPLY,
WATER_DEMAND,
COMPLAINT_NUM,
WARNING_NUM,
REPAIR_AREA,
PAUSE_SUPPLY_AREA,
EVENT_NUM,
STAT_DATE)
VALUES
(SRC.WATERSUPPLY,
SRC.WATERDEMAND,
SRC.COMPLAINTNUM,
SRC.WARNINGNUM,
SRC.REPAIRAREA,
SRC.PAUSESUPPLYAREA,
SRC.EVENTNUM,
SRC.STATDATE)
使用多行更新与插入的时候,当ON (HIS.STAT_DATE = SRC.STATDATE)存在多个数据相等的时候会报错,所以需要规避这个问题规避这个问题是使用
ROW_NUMBER() OVER(PARTITION BY STATDATE ORDER BY WATERSUPPLY) rn 来分组排列取这第一行的
备注:有个问题是取出第一行,有些数据就会无用。