SQL:删除表中重复数据的记录,并保留

解决程序异常导致的表内数据重复的问题

表内数据量小时

  • 删除语句
    DElETE
    	* 
    FROM
    	USER u 
    WHERE
    	u.username IN ( 
    	SELECT USER.username 
    	FROM USER 
    	GROUP BY USER.username 
    	HAVING count( USER.username ) > 1
    	 ) 
    	AND
    	 u.id NOT IN (
    	SELECT min( id ) AS id 
    	FROM USER 
    	GROUP BY 
    	USER.username 
    	HAVING count( USER.username ) > 1 
    	)
    )
    

解析

  • 根据重复条件进行分组,过滤出重复的数据(例:username为重复的字段)

    u.username IN ( 
    SELECT USER.username 
    FROM USER 
    GROUP BY USER.username 
    HAVING count( USER.username ) > 1
    ) 
    
  • 保留一个数据,通过集合函数进行指定,例:指定的最小id的记录数据保留

    u.id NOT IN (
    SELECT min( id ) AS id 
    FROM USER 
    GROUP BY 
    USER.username 
    HAVING count( USER.username ) > 1 
    )
    

表内数据量大时

  • 对上面的代码进行内连接操作,优化执行效率

    SELECT
    	* 
    FROM
    	USER u,
    	(
    	SELECT 
    		username,
    		min( id ) AS id 
    	FROM
    	USER 
    	GROUP BY
    		USER.username 
    	HAVING
    		count( * ) > 1 
    	) un 
    WHERE
    	u.id != un.id 
    	AND u.username = un.username
    

解析

  • 进行查询重复数据内容(指定字段username)和保留的条件指定min( id ) AS id,指定其他重复数据,需要修改查询的显示内容,以及分组的条件

    SELECT 
    	username,
    	min( id ) AS id 
    FROM
    USER 
    GROUP BY
    	USER.username 
    HAVING
    	count( * ) > 1 
    
  • 进行重复数据字段指定,不删除保留的数据,其他条件需要添加更多条件,与上面的SQL查询显示的数据对应

    u.id != un.id 
    AND u.username = un.username
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘿嘿嘿1212

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值