MSSQL查询和删除重复记录

在工作中,我们经常会发现表中会存在重复数据,那么如何找出和删除这些数据呢?

下面,以一个小例子来说明:

1、创建学生表

CREATE TABLE student1(
id INT PRIMARY KEY,
stuno VARCHAR(12) NOT NULL,
stuname VARCHAR(30) NOT null
);

2、向学生表中插入数据

INSERT INTO student1 VALUES ('1','131111099','小李');
INSERT INTO student1 VALUES ('2','131111100','小陈');
INSERT INTO student1 VALUES ('3','131111101','小王');
INSERT INTO student1 VALUES ('4','131111102','小黑');
INSERT INTO student1 VALUES ('5','131111099','小曹');
INSERT INTO student1 VALUES ('6','131111099','小李');

3、查找仅学号重复的记录

从插入记录上看,id为1、5、6的记录学号都是相同的,那么验证一下查询的数据是否正确

-- 学号重复 
-- 先按学号进行分组,然后查询学数量 > 1的记录的学号 
SELECT * FROM student1 WHERE stuno IN ( 
-- 查找重复的学号 
SELECT stuno FROM student1 GROUP BY stuno HAVING COUNT(stuno) > 1);

查询结果和我们事先分析的数据一致,所以查询结果是正确的。

4、查找学号和姓名均重复的记录

从插入记录上看,只有id为1、6的记录学号和姓名是完全重复的,那么验证一下查询的数据是否正确

-- 学号和姓名均重复,MYSQL中支持联合字段来查询,但是mssql中好像是不支持的,所以只能分别进行查询。
--先查学号重复的and查姓名重复的

SELECT stuno,stuname,cj FROM student1 WHERE stuno
IN ( 
SELECT stuno FROM student1 GROUP BY stuno HAVING COUNT(stuno) > 1)
and stuname
IN ( 
SELECT stuname FROM student1 GROUP BY stuname HAVING COUNT(stuname) > 1)

查询结果和我们事先分析的数据一致,所以查询结果是正确的。

5、删除多余的重复记录(多个字段),只保留最小id的记录

重复记录可能有多条,但是我们只希望保留id最小的那条记录,因为学号和姓名均重复的只有id为1、6的记录,保留id为1的记录,那么验证一下查询的数据是否正确

-- 删除多余的重复记录(多个字段),只保留最小id的记录 
--查找重复的记录
delete from student1 where id in  
(
select id FROM student1 WHERE id  IN 
( 
SELECT id FROM student1 WHERE stuno
IN ( 
SELECT stuno FROM student1 GROUP BY stuno HAVING COUNT(stuno) > 1)
and stuname
IN ( 
SELECT stuname FROM student1 GROUP BY stuname HAVING COUNT(stuname) > 1)
) 
--排除重复的记录中最小的记录
and id not in 
(
( 
SELECT min(id) FROM student1 WHERE stuno
IN ( 
SELECT stuno FROM student1 GROUP BY stuno HAVING COUNT(stuno) > 1)
and stuname
IN ( 
SELECT stuname FROM student1 GROUP BY stuname HAVING COUNT(stuname) > 1)
) 
)
)

可以看出,id为6的记录已经被删除了,所以结果正确。

提问:语句有点繁杂,不知道还有没有简单的写法,另外MYSQL的联合字段查询,在MSSQL中支持吗,请哪位看到给个回复?

赞(34) 打赏
未经允许不得转载:我的工作经历分享 » MSSQL查询和删除重复记录

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏