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>
<update id="updateBatchNextTriggerAtById" parameterType="java.util.List">
UPDATE job AS rt
SET rt.next_trigger_at = tt.next_trigger_at
FROM (
<foreach collection="list" item="item" index="index" separator=" union all ">
select
#{item.nextTriggerAt} as next_trigger_at,
#{item.id} as id
MERGE INTO job dest
USING (
<foreach collection="list" item="item" index="index" separator=" UNION ALL ">
SELECT
#{item.nextTriggerAt} AS next_trigger_at,
#{item.id} AS id
FROM DUAL
</foreach>
) AS tt
WHERE rt.id = tt.id
) src
ON (dest.id = src.id)
WHEN MATCHED THEN
UPDATE SET dest.next_trigger_at = src.next_trigger_at
</update>
</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})
</foreach>
</insert>
<update id="updateBatchNextTriggerAtById" parameterType="java.util.List">
UPDATE retry_task_${partition} AS rt
SET next_trigger_at = tt.next_trigger_at
FROM (
<foreach collection="list" item="item" index="index" separator=" union all ">
select
#{item.nextTriggerAt} as next_trigger_at,
#{item.id} as id
MERGE INTO retry_task_${partition} dest
USING (
<foreach collection="list" item="item" index="index" separator=" UNION ALL ">
SELECT
#{item.nextTriggerAt} AS next_trigger_at,
#{item.id} AS id
FROM DUAL
</foreach>
) AS tt
WHERE rt.id = tt.id
) src
ON (dest.id = src.id)
WHEN MATCHED THEN
UPDATE SET dest.next_trigger_at = src.next_trigger_at
</update>
</mapper>

View File

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