一.问题背景
项目中有全表数据一键剔除重复的需求场景,也就是一张数据表中除了主键、创建时间、修改时间等基本字段,其他业务字段均参与剔重校验,任何两行数据中,参与剔重校验的所有字段值完全相同则为重复,重复数据仅保留一行,其余删除。
二.实现思路
将所有参与剔重校验的字段进行分组,保留分组数据中id最大的那一条,其余删除。
三.实现代码
此处展示MyBatis代码,转换为sql同理。
<!--剔除重复-->
<update id="removeRepetition2" parameterType="CmsPipeDescription">
update `${tableName}` set if_del = 1 WHERE id not in ( <!--保留分组数据中id最大的那一条,其余做逻辑删除-->
select t.id from (
select max(id) as id from `${tableName}` <!--查询分组数据中最大id-->
where if_del = 0 <!--此处为业务需要的基本查询条件-->
group by <!--根据所有判重字段分组-->
<foreach collection="attributeList" item="item" separator=",">
`${item}`
</foreach>
) t
)
</update>