-
sql语句大全之SQLServer数据库中处理重复数据
今天公司编辑部有一妹纸,遇到问题,是需要处理数据库中重复的数据,于是想办法帮忙解决,要求删除重复的数据,该表中只有一个字段,假设为保存的公司名,这是经过多重过滤之后,最终留下的的数据,需要进行筛选,然后重复的数据只保留一条,最上边或最下边的都可以,有且仅有一条,整张表的数据量大概在20W左右,重复量多少不清楚,可能很多,可能很少,废话话不多说,开始解决问题,第一次写博客,不会排版。
首先,如图所示,这里是我假定的数据,
从图中可以看到,CompanyName表中只有一个名为CName的字段,里边有一些值,模拟处理的数据,可以看到,里边有一些重复的数据,这些就是我们将要处理的数据,处理之后应该是这样,对应的SQL语句是
````SELECT distinct [CName]
FROM [CreamBlog].[dbo].[CompanyName]
where CName in (select CName from CompanyName group by CName having COUNT(CName)>1)
首先我们需要筛选出重复的数据,不重复的就不需要管,然后列出重复的数据,把上边查询中的distinct去掉,就可以找到所有重复的数据,在后边一句count(CName)>1这里进行重复数据的筛选
经过对比我们可以发现,上图中的机器人公司是只有一条数据,因此这样就已经经过一次过滤,然后就是重复数据的处理,我们假设要把最顶上的信息删除,如果信息量多,我们比较容易实现,但是现在只有一个字段,那么应该如何考虑,在这里有一个小技巧(个人认为),首先可以在CompanyName的表中新增加一列,这里设置字段名为Num(名字随便起),然后在标识规范中进行设置为自增为1的字段
然后保存,结果应该是这样
紧接着,我们用这个Num字段来进行再一次的过滤,先用之前的方法过滤出来重复的,然后再把Num字段中大的值给查询出来,然后Num小的值留下,当然,也可以把里边的Min改为Max,这样就是把Num小的值查询出来,把Num大的值留下,如图
,附上SQL语句
```SELECT [CName],Num
FROM [CreamBlog].[dbo].[CompanyName]
where CName in (select CName from CompanyName group by CName having COUNT(CName)>1)
and Num not in (select Min(Num) from CompanyName group by CName having COUNT(CName)>1),这样其实已经把所有的重复的值找了出来,并且把我们想要保留的保存了下来,接着进行删除操作,首先我们进行查询,我们最终的结果是什么样子,如图
换成查询数量,也就是说我们要查出这个数量,就是正确的,这个就是处理结束之后,最终我们想要的结果,这里是全部处理完之后把多余的删除了,重复数据只保留一条的结果
Select COUNT(*) as count from ( SELECT distinct [CName] FROM [CreamBlog].[dbo].[CompanyName] where CName in (select CName from CompanyName group by CName )) as t1,对于我模拟的数据,最终是6条
delete FROM [CreamBlog].[dbo].[CompanyName]
where CName in (select CName from CompanyName group by CName having COUNT(CName)>1)
and Num not in (select Min(Num) from CompanyName group by CName having COUNT(CName)>1),到此为止,整个重复处理过程就完工了。
总结一下,首先是分组排序,然后找出重复的,过滤掉单个数据,紧接着过滤掉多个重复的数据,留下多余的数据,接着删除数据。
PS:友情提醒,删除数据属于危险行为,删除前请谨慎操作,先查询出来,看看是不是自己要删除的数据,再进行操作,另外,最好留一个备份。