SqlServer中怎么刪除重復的記錄(表中沒有id)
其實我在別的網址也查到過刪除重復的記錄,不知道我是我SqlServer2012版本太低還是啥原因
delete from sc
where (c#,s#) in (select c#,s# from sc group by c#,s# having count(1)>1)
and rowid not in (select min(rowid) from sc group by c#,s# having count(1)>1)
像這個就執行不通,(真想罵人),還tm這么多,首先這個表中你得有個rowid,我們平時都不會加的,而且where (s#,c#) in(select S#,c# from ...) 報錯
所以,我就查查查,寫寫寫,終於可以不用表中id就可以刪除了。
先建立一個2個表Student和SC
use test
create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
insert into Student values('01' , N'趙雷' , '1990-01-01' , N'男')
insert into Student values('02' , N'錢電' , '1990-12-21' , N'男')
insert into Student values('03' , N'孫風' , '1990-05-20' , N'男')
insert into Student values('04' , N'李雲' , '1990-08-06' , N'男')
insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')
insert into Student values('06' , N'吳蘭' , '1992-03-01' , N'女')
insert into Student values('07' , N'鄭竹' , '1989-07-01' , N'女')
insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')
insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')
create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
insert into Course values('01' , N'語文' , '02')
insert into Course values('02' , N'數學' , '01')
insert into Course values('03' , N'英語' , '03')
create table Teacher(T# varchar(10),Tname nvarchar(10))
insert into Teacher values('01' , N'張三')
insert into Teacher values('02' , N'李四')
insert into Teacher values('03' , N'王五')
create table SC(S# varchar(10),C# varchar(10),score decimal(18,1))
insert into SC values('01' , '01' , 80)
insert into SC values('01' , '02' , 90)
insert into SC values('01' , '03' , 99)
insert into SC values('02' , '01' , 70)
insert into SC values('02' , '02' , 60)
insert into SC values('02' , '03' , 80)
insert into SC values('03' , '01' , 80)
insert into SC values('03' , '02' , 80)
insert into SC values('03' , '02' , 80)
insert into SC values('03' , '02' , 80)
insert into SC values('03' , '03' , 80)
insert into SC values('04' , '01' , 50)
insert into SC values('04' , '02' , 30)
insert into SC values('04' , '03' , 20)
insert into SC values('05' , '01' , 76)
insert into SC values('05' , '02' , 87)
insert into SC values('06' , '01' , 31)
insert into SC values('06' , '03' , 34)
insert into SC values('07' , '02' , 89)
insert into SC values('07' , '03' , 98)
insert into SC values('07' , '03' , 98)
insert into SC values('07' , '03' , 98)
go
1、刪除student表中s#重復的記錄
1.1重復的只有一個字段時
1.1查出重復的記錄來
由於student表中沒有id,所以我們先搞個查詢語句,並且自己創造個id
select s#,row_number() over(partition by s# order by s#) as id from Student
注釋:
row_number() over(partition by s# order by s#)
按s#進行分組排序,row_number()表示s#相同情況下也進行排序,詳細用法可以百度,謝謝
1.2刪除重復的記錄
with ab as(
select * from
(select s#,row_number() over(partition by s# order by s#) as id from Student ) a
where id>1)
delete from ab
注釋(可不看):
因為where id>1是指將id=1的字段保留,多余的刪除
此公式Student是表名,s#是字段名,套用公式,只要修改有顏色的表名和字段名就行,其他可以不用管。
2.1刪除SC中s#,c#兩個字段均重復的記錄(刪除多個字段重復的記錄)
2.1.1查詢多個字段重復的記錄,與1.1相似,就不解釋了
查詢表SC中s#,c#兩個字段均重復的記錄,也標記為id
select s#,c# ,row_number() over(partition by s#,c# order by s#,c#) as id from sc
2.1.2刪除該記錄
刪除id大於1的記錄,由於id在where里面不能直接使用,所以要嵌套一個select * from (... )a where a.id>1
with abc as
(select * from
(select s#,c# ,row_number() over(partition by s#,c# order by s#,c#) as id from sc) a
where id>1)
delete from abc
注釋:
s#,c#分別是【字段名1】和【字段名2】,而sc是表名,刪除時套用以上公式修改這些有顏色的字就行。
with ... as 可以自行百度看
共同分享,如有更好的方法請留言,謝謝!