fix: UPDATE select子查询需要MERGE INTO实现

This commit is contained in:
dhb52 2024-03-18 23:44:08 +08:00
parent ec2e826f38
commit c70948c34a
3 changed files with 38 additions and 30 deletions

View File

@ -27,16 +27,18 @@
</resultMap> </resultMap>
<update id="updateBatchNextTriggerAtById" parameterType="java.util.List"> <update id="updateBatchNextTriggerAtById" parameterType="java.util.List">
UPDATE job AS rt MERGE INTO job dest
SET rt.next_trigger_at = tt.next_trigger_at USING (
FROM ( <foreach collection="list" item="item" index="index" separator=" UNION ALL ">
<foreach collection="list" item="item" index="index" separator=" union all "> SELECT
select #{item.nextTriggerAt} AS next_trigger_at,
#{item.nextTriggerAt} as next_trigger_at, #{item.id} AS id
#{item.id} as id FROM DUAL
</foreach> </foreach>
) AS tt ) src
WHERE rt.id = tt.id ON (dest.id = src.id)
WHEN MATCHED THEN
UPDATE SET dest.next_trigger_at = src.next_trigger_at
</update> </update>
</mapper> </mapper>

View File

@ -31,16 +31,19 @@
(#{item.namespaceId}, #{item.uniqueId}, #{item.groupName}, #{item.sceneName}, #{item.idempotentId}, #{item.bizNo}, #{item.executorName}, #{item.argsStr}, #{item.extAttrs}, #{item.nextTriggerAt}, #{item.taskType}, #{item.retryStatus}, #{item.createDt}) (#{item.namespaceId}, #{item.uniqueId}, #{item.groupName}, #{item.sceneName}, #{item.idempotentId}, #{item.bizNo}, #{item.executorName}, #{item.argsStr}, #{item.extAttrs}, #{item.nextTriggerAt}, #{item.taskType}, #{item.retryStatus}, #{item.createDt})
</foreach> </foreach>
</insert> </insert>
<update id="updateBatchNextTriggerAtById" parameterType="java.util.List"> <update id="updateBatchNextTriggerAtById" parameterType="java.util.List">
UPDATE retry_task_${partition} AS rt MERGE INTO retry_task_${partition} dest
SET next_trigger_at = tt.next_trigger_at USING (
FROM ( <foreach collection="list" item="item" index="index" separator=" UNION ALL ">
<foreach collection="list" item="item" index="index" separator=" union all "> SELECT
select #{item.nextTriggerAt} AS next_trigger_at,
#{item.nextTriggerAt} as next_trigger_at, #{item.id} AS id
#{item.id} as id FROM DUAL
</foreach> </foreach>
) AS tt ) src
WHERE rt.id = tt.id ON (dest.id = src.id)
WHEN MATCHED THEN
UPDATE SET dest.next_trigger_at = src.next_trigger_at
</update> </update>
</mapper> </mapper>

View File

@ -15,17 +15,20 @@
<result column="deleted" property="deleted" /> <result column="deleted" property="deleted" />
<result column="ext_attrs" property="extAttrs" /> <result column="ext_attrs" property="extAttrs" />
</resultMap> </resultMap>
<update id="updateBatchNextTriggerAtById" parameterType="java.util.List"> <update id="updateBatchNextTriggerAtById" parameterType="java.util.List">
UPDATE workflow AS rt MERGE INTO workflow dest
SET next_trigger_at = tt.next_trigger_at USING (
FROM ( <foreach collection="list" item="item" index="index" separator=" UNION ALL ">
<foreach collection="list" item="item" index="index" separator=" union all "> SELECT
select #{item.nextTriggerAt} AS next_trigger_at,
#{item.nextTriggerAt} as next_trigger_at, #{item.id} AS id
#{item.id} as id FROM DUAL
</foreach> </foreach>
) AS tt ) src
WHERE rt.id = tt.id ON (dest.id = src.id)
WHEN MATCHED THEN
UPDATE SET dest.next_trigger_at = src.next_trigger_at
</update> </update>