关于sql多表去重问题

本文探讨了SQL中如何处理去重问题,包括使用`DISTINCT`关键字的效果以及在处理大量数据时的效率问题。针对百万级以上数据的去重,提出了两种方法,一种是使用`DELETE`配合`ROW_NUMBER()`,另一种是利用临时表进行操作,后者在效率上优于前者。文章还强调了在处理大规模重复数据时,如何优化删除操作以避免长时间运行和锁表。
摘要由CSDN通过智能技术生成

很多人新手对于数据库distinct 的用法有误解接下来我们看一段代码:

   数据表:table  id name

   1 a
   2 b
   3 c
   4 c
   5 b

 

  我们使用distinct来去重name是这样:

 select distinct name from table 结果为:

     a

     b

    c

 可是一般数据库去重都是需要不止一个字段接下来看这个:

  select distinct name, id from table 多了个id效果会怎样呢

   1 a
   2 b
   3 c
   4 c
   5 b

  结果并不是我们想象的一样去重了接下来我们继续:

  select *, count(distinct name) from table group by name 这条sql 就不一样了效果如下

   1 a 1

   2 b 1

   3 c 1

  看到效果了吧,只是后面多了一个count 查出来的数据这个不影响,是可以用的.

 

  

2.Sql去重语句

 

海量数据(百万以上),其中有些全部字段都相同,有些部分字段相同,怎样高效去除重复?

如果要删除手机(mobilePhone),电话(officePhone),邮件(email)同时都相同的数据,以前一直使用这条语句进行去重:

1 delete from 表 where id not in
2 (select max(id) from 表 group by mobilePhone,officePhone,email )
3 or
4 delete from 表 where id not in
5 (select min(id) from 表 group by mobilePhone,officePhone,email )

其中下面这条会稍快些。上面这条数据对于100万以内的数据效率还可以,重复数1/5的情况下几分钟到几十分钟不等,但是如果数据量达到300万以上,效率骤降,如果重复数据再多点的话,常常会几十小时跑不完,有时候会锁表跑一夜都跑不完。无奈只得重新寻找新的可行方法,今天终于有所收获:

1 //查询出唯一数据的ID,并把他们导入临时表tmp中
2 select min(id) as mid 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值