2015-08-25 79 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