fix(sql): 优化coil操作查询逻辑

- 使用ROW_NUMBER窗口函数替代子查询和JOIN操作
- 简化查询结构,提高执行效率
- 保留对coilIds的可选过滤条件
- 确保每个coilId只返回最新的记录
This commit is contained in:
2025-12-17 14:32:30 +08:00
parent 2b88b03629
commit f6ea637c29

View File

@@ -17,28 +17,20 @@
<result property="updateTime" column="update_time"/>
</resultMap>
<select id="getCoilOperate" resultMap="WmsDeliveryPlanCoilOperateResult">
SELECT t.*
FROM wms_delivery_plan_coil_operate t
INNER JOIN (
-- 子查询先获取每个coilId的最新创建时间限定planId和coilIds
SELECT * FROM (
SELECT
coil_id,
MAX(create_time) AS max_create_time
FROM wms_delivery_plan_coil_operate
t.*,
ROW_NUMBER() OVER (PARTITION BY t.coil_id ORDER BY t.create_time DESC) AS rn
FROM wms_delivery_plan_coil_operate t
WHERE plan_id = #{planId}
AND coil_id IN
<foreach collection="coilIds" item="coilId" open="(" separator="," close=")">
#{coilId}
</foreach>
GROUP BY coil_id
) t_max ON t.plan_id = #{planId}
AND t.coil_id = t_max.coil_id
AND t.create_time = t_max.max_create_time
-- 最终过滤目标coilIds双重保障
WHERE t.coil_id IN
<foreach collection="coilIds" item="coilId" open="(" separator="," close=")">
#{coilId}
</foreach>
<if test="coilIds != null and coilIds.length > 0">
AND coil_id IN
<foreach collection="coilIds" item="coilId" open="(" separator="," close=")">
#{coilId}
</foreach>
</if>
) tmp
WHERE tmp.rn = 1
</select>