sql去重

本文分享了在数据库中高效去除重复记录的SQL语句,采用先创建包含重复记录最小ID的临时表,再通过比较ID大小的方式进行去重。同时介绍了使用DISTINCT和GROUP BY进行查询去重的方法及性能对比。

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

一.数据库清洗去重

在数据库里清洗时,会用到DELETE语句进行操作,很多时候需要删除重复记录保存,保存一条。百度之后有些语句会报错,直到发现一个在实战中可以用不会报错的,并且跑起来很快的一条sql语句

DELETE consum_record
FROM
 consum_record, 
 (
  SELECT
   min(id) id,
   user_id,
   monetary,
   consume_time
  FROM
   consum_record
  GROUP BY
   user_id,
   monetary,
   consume_time
  HAVING
   count(*) > 1
 ) t2
WHERE
 consum_record.user_id = t2.user_id 
 and consum_record.monetary = t2.monetary
 and consum_record.consume_time = t2.consume_time
AND consum_record.id > t2.id;

1.(SELECT min(id) id,user_id,monetary,consume_time FROM consum_record GROUP BY user_id,monetary,consume_time HAVING count(*) > 1 ) t2  将重复数据建一张临时表,集合里是重复记录的最小id

2.关联两张表,根据条件删除原表大于投t2表的记录,这样就可以去重保留一条

 

二.查询去重

查询去重有两种方法,一个是distinct,一个是group by,distinct 用于select 语句中,group by使用的频率相对较高,它的目的是用来进行聚合统计的,但也可以实现去重的功能。速度会慢与distinct

### 三级标题:SQL 查询复记录的方法 在 SQL 查询中,是常见的操作之一,尤其在处理数据冗余、数据清洗或报表统计时尤为要。根据不同的业务需求和数据结构,可以采用多种方式实现。 最简单的情况是表中存在完全复的记录,此时可使用 `SELECT DISTINCT *` 来获取无复的结果集: ```sql SELECT DISTINCT * FROM tableName; ``` 此语句将返回所有字段均不复的记录,适用于字段数量较少且数据一致性较高的场景[^1]。 若需要删除这些完全复的记录并保留唯一的一条记录,可以通过临时表的方式实现。具体步骤如下: 1. 将后的结果存入临时表; 2. 删除原表; 3. 将临时表中的数据新导入原表; 示例如下: ```sql SELECT DISTINCT * INTO #Tmp FROM tableName; DROP TABLE tableName; SELECT * INTO tableName FROM #Tmp; DROP TABLE #Tmp; ``` 该方法适用于数据量较小的表,对于大型表应谨慎使用以避免性能问题。 对于部分关键字段复的记录(如用户名和密码组合复),可以使用子查询结合聚合函数进行。例如查找所有具有复 `nick_name` 和 `password` 的用户记录: ```sql SELECT * FROM user WHERE (nick_name, password) IN ( SELECT nick_name, password FROM user GROUP BY nick_name, password HAVING COUNT(nick_name) > 1 ); ``` 该查询将返回所有在 `nick_name` 和 `password` 组合上复的记录。在此基础上,如果只想保留每组中某个特定记录(如 ID 最小或最大的记录),可以进一步筛选出多余的记录并进行删除操作: ```sql DELETE FROM user WHERE (nick_name, password) IN ( SELECT nick_name, password FROM ( SELECT nick_name, password FROM user GROUP BY nick_name, password HAVING COUNT(nick_name) > 1 ) AS tmp1 ) AND id NOT IN ( SELECT id FROM ( SELECT MIN(id) AS id FROM user GROUP BY nick_name, password HAVING COUNT(nick_name) > 1 ) AS tmp2 ); ``` 上述语句将删除每组复记录中除最小 ID 外的所有记录,适用于需要保留原始数据逻辑一致性的场景[^2]。 此外,还可以通过主键或唯一标识字段与分组函数结合使用来识别复记录。例如在某张人员信息表中,查找 `peopleId` 和 `seq` 字段组合复的记录: ```sql SELECT * FROM vitae WHERE (peopleId, seq) IN ( SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING COUNT(*) > 1 ); ``` 该方法常用于复杂业务系统中识别潜在的数据冲突点,并为进一步的数据清理提供依据[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值