SqlServer中怎么刪除重復的記錄(表中沒有id)


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 可以自行百度看

 共同分享,如有更好的方法請留言,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM