mysql查找和删除重复数据,保留id最小的一条

博客介绍了在大量数据中,针对重复数据进行操作的方法。通过具体例子,说明了如何使用SQL查询和删除重复数据,包括根据单个字段(dname)和多个字段(dname和db_source)判断重复的情况,同时提醒了SQL语法机制及临时表别名的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在大量数据的情况下,可能会存在某些数据重复的情况,比如说某个字段重复,某几个字段重复,有时候我们需要针对重复数据进行一些操作,下面通过例子说明如何查询和删除重复数据。

假如有如下数据表,表名dep,其中deptno为主键


1、查询重复数据,重复记录是根据单个字段(dname)来判断


SELECT
    *
FROM
    dep
WHERE
    dname IN (
        SELECT
            dname
        FROM
            dep
        GROUP BY
            dname
        HAVING
            count(dname) > 1
    )

查询结果如下:

 

 

2、删除表中多余的重复记录,只保留deptno最小的记录,重复记录还是根据单个字段(dname)来判断

DELETE
FROM
	dep
WHERE
	dname IN (
		SELECT
			*
		FROM
			(
				SELECT
					dname
				FROM
					dep
				GROUP BY
					dname
				HAVING
					COUNT(dname) > 1
			) AS t1
	)
AND deptno NOT IN (
	SELECT
		*
	FROM
		(
			SELECT
				MIN(deptno)
			FROM
				dep
			GROUP BY
				dname
			HAVING
				COUNT(dname) > 1
		) AS t2
)

执行后结果:

注:where 第一个字句为查询的是所有重复dname的数据,and连接的第二个字句排除deptno最小的,同时这里还需要注意的是

每一个嵌套查询里还添加了个select * from,这里这么做的原因是sql的语法机制,sql不允许在同一个表中既做查询又做修改,如果发生会报

You can't specify target table 'dep' for update in FROM clause

这样的错误,所以我们通过加上这个字句构造一个中间的临时表。临时表必须要加别名!!临时表必须要加别名!!临时表必须要加别名!!不然会报错的,所以我这里分别取别名t1,t2

3、查找表中多余的重复记录(多个字段),以dname和db_source来判断是否重复 

有如下表:


SELECT
	*
FROM
	dep
WHERE
	(dname, db_source) IN (
		SELECT
			dname,
			db_source
		FROM
			dep
		GROUP BY
			dname,
			db_source
		HAVING
			count(*) > 1
	)

查询结果:

 

4、删除表中多余的重复记录(多个字段),以dname和db_source来判断是否重复 ,只保留有peopleId最小的记录

DELETE
FROM
	dep
WHERE
	(dname, db_source) IN (
		SELECT
			dname,
			db_source
		FROM
			(
				SELECT
					dname,
					db_source
				FROM
					dep
				GROUP BY
					dname,
					db_source
				HAVING
					count(*) > 1
			) AS t1
	)
AND deptno NOT IN (
	SELECT
		*
	FROM
		(
			SELECT
				min(deptno)
			FROM
				dep
			GROUP BY
				dname,
				db_source
			HAVING
				count(*) > 1
		) AS t2
)

执行结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值