2015-08-25 75 views
0

我想复制一个场景,我需要从表中删除除了一个表的所有重复的行。但所有行都有唯一的标识列。从身份证删除SQL Server 2012表的重复记录

为了使事情更容易,我创建了一个小测试表学生,脚本如下。

create table student 
(
    id int, 
    rollno int, 
    name varchar(50), 
    course varchar(50) 
) 
GO 

insert into student values(1,1335592,'john','biology') 
insert into student values(2,1335592,'john','biology') 
insert into student values(3,1335592,'john','biology') 
insert into student values(4,1335592,'john','biology') 
insert into student values(5,1335593,'peter','biology') 
insert into student values(6,1335593,'peter','biology') 
insert into student values(7,1335593,'peter','biology') 
GO 

select * from student 

这将生成如下表格。

id rollno name course 
1 1335592 john biology 
2 1335592 john biology 
3 1335592 john biology 
4 1335592 john biology 
5 1335593 peter biology 
6 1335593 peter biology 
7 1335593 peter biology 

我想在结果集中保留ID为'1'和'5'的记录并删除其他所有内容。有没有办法做到这一点?

所有帮助将不胜感激。

感谢 Shammas

回答

1

这是简单的查询

Delete from student 
where id not in (select min(id) 
       from student 
       group by rollno, name, course) 
+0

感谢Ullas..It为我工作..在发布问题后,我发现链接http://blog.sqlauthority.com/2007/03/01/sql-server-delete-duplicate-records-行/它被很好地定义。感谢您的回复 – Shammas

+0

@Shammas不要感谢,如果它是帮助,然后给予的投票和正确的标记... –

+0

对不起Mukhesh ..我是一个新用户,不能投票;-( – Shammas

4

使用CTE

查询

;with cte as 
(
    select rn=row_number() over 
    (
    partition by rollno,name,course 
    order by id 
),* 
    from student 
) 
delete from cte 
where rn > 1; 

Fiddle demo

+0

由于流浪者。这个脚本也是正确的。对不起,最近的回复 – Shammas

1

可以使用 DENSE_RANKROW_NUMBERRANK

这些all'll会给你结果。

尝试:

create table student 
(id int, 
rollno int, 
name varchar(50), 
course varchar(50) 
) 
GO 

insert into student values(1,1335592,'john','biology') 
insert into student values(2,1335592,'john','biology') 
insert into student values(3,1335592,'john','biology') 
insert into student values(4,1335592,'john','biology') 
insert into student values(5,1335593,'peter','biology') 
insert into student values(6,1335593,'peter','biology') 
insert into student values(7,1335593,'peter','biology') 
GO 



;with cte as 
(
    select rn=row_number() over 
    (
    partition by rollno,name,course 
    order by id 
),* 
    from student 
) 
select * from cte where rn=1 

;with cte2 as 
(
    select rn=RANK() over 
    (
    partition by rollno,name,course 
    order by id 
),* 
    from student 
) 
select * from cte2 where rn=1 

;with cte3 as 
(
    select rn=Dense_RANK() over 
    (
    partition by rollno,name,course 
    order by id 
),* 
    from student 
) 
select * from cte3 where rn=1 

Difference between ROW_NUMBER(), RANK() and DENSE_RANK()

1
DELETE s 
FROM student s 
JOIN student s2 ON s.course = s2.course 
    AND s.NAME = s2.NAME 
    AND s.rollno = s2.rollno 
WHERE s2.id < s.id 
+0

这个脚本经过测试正确。 – Shammas