一般的后台程序基本上都会遇到和数据库交互的情况,在这种情况里面又会碰到数据库表数据的去重需求,鉴于此,我把自己在项目中遇到的情况做了一个整理,方便自己以后查看,也希望能给看到这边文章的你提供一个思路,闲话就不扯了,直接上干货……数据库为 mssql 08 r2
其中表的结构和数据如下图:
![](https://img-blog.csdn.net/20170410142726572?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRmFpcnlTdGVwV0dM/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
查询表中单列重复
一.带有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
语句运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/48503b90fb3f466b27ca7da9c040f13a.png)
(2)DISTINCT 查询多列不重复(如果查询的列有任何一个不重复,则这条记录视为不重复)
语句运行结果
-------语句:
SELECT DISTINCT Name,Uid FROM dbo.Member
语句运行结果
![](http://images0.cnblogs.com/blog2015/339132/201506/121818338947050.png)
DISTINCT 用于统计
--------语句
SELECT COUNT(DISTINCT(Name)) FROM dbo.Member
数据表结构
![](https://i-blog.csdnimg.cn/blog_migrate/5734158c57fd19ecadacad4ac3332064.png)
查找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
![](https://i-blog.csdnimg.cn/blog_migrate/4541d26fa67218e14f45ff80a81afc99.png)