码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server 一列或多列重复数据的查询,删除

时间:2018-02-02 14:22:38      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:strong   name   not   let   server   src   一个   sel   分享   

业务需求

最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库)。要求导入目标数据库的数据不能出现重复。但情况是数据源本身就有重复的数据。所以要先清除数据源数据。

于是就把关于重复数据的查询和处理总结一下。这里只可虑基于数据库解决方案。不考虑程序的实现。

环境为:SQL Server 2008

基于数据库的解决方案

数据库测试表dbo.Member

技术分享图片

一、单列重复

一,带有having条件的分组查询方法

(1)查询某一列重复记录

语句:

  SELECT  Name FROM  dbo.Member t WHERE Name IN (SELECT Name FROM dbo.Member GROUP BY Name HAVING COUNT(Name)>1 ) ORDER BY t.Name

查询结果:

技术分享图片

(2)查询某一列不重复的记录

语句:

SELECT * FROM dbo.Member WHERE ID  IN (SELECT MIN(ID) FROM dbo.Member GROUP BY Name)

查询结果:

技术分享图片

(3)清除某一列重复的数据

语句:

 DELETE FROM dbo.Member WHERE ID NOT IN (SELECT MIN(ID) FROM dbo.Member GROUP BY Name)

执行结果:

技术分享图片

解释:上面的例子只保存了各自Name的最小值。

二,DISTINCT 的用法
温馨提醒:
不支持多列统计
Oracle和DB2数据库也适用

利用distinct关键字返回唯一不同的值

(1)查询某一列不重复数据

语句:

  SELECT DISTINCT Name FROM dbo.Member

结果集:

技术分享图片

(2)DISTINCT 查询多列不重复(如果查询的列有任何一个不重复,则这条记录视为不重复)

语句:

SELECT DISTINCT Name,Uid FROM dbo.Member
查询结果

技术分享图片


DISTINCT 用于统计

语句
 SELECT COUNT(DISTINCT(Name)) FROM dbo.Member

 二、多列重复

 

数据表结构

技术分享图片

查找Original_ID和Match_ID这两列值重复的行

SQL语句

技术分享图片
SELECT m.* FROM dbo.Match m,(
SELECT Original_ID,Match_ID
FROM dbo.Match 
GROUP BY Original_ID,Match_ID
HAVING COUNT(1)>1

) AS m1
WHERE m.Original_ID=m1.Original_ID AND m.Match_ID=m1.Match_ID
技术分享图片

 

查询结果

技术分享图片
技术分享图片
技术分享图片

SQL Server 一列或多列重复数据的查询,删除

标签:strong   name   not   let   server   src   一个   sel   分享   

原文地址:https://www.cnblogs.com/shiyh/p/8404246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!