SQL命令删除一个表中相同记录
0
推荐 删除重复数据
一、具有主键的情况
a.具有唯一性的字段id(为唯一主键)
delect table
where id not in
(
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,
那么只要col1字段内容相同即表示记录相同。
b.具有联合主键
假设col1+','+col2+','...col5 为联合主键
select * from table where col1+','+col2+','...col5 in (
select max(col1+','+col2+','...col5) from table
where having count(*)>1
group by col1,col2,col3,col4
)
group by 子句后跟的字段就是你用来判断重复的条件,
如只有col1,那么只要col1字段内容相同即表示记录相同。
or
select * from table where exists (select 1 from table x where table.col1 = x.col1 and
table.col2= x.col2 group by x.col1,x.col2 having count(*) >1)
c:判断所有的字段
select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa
二、没有主键的情况
a:用临时表实现
select identity(int,1,1) as id,* into #temp from ta
delect #temp
where id not in
(
select max(id) from # group by col1,col2,col3...
)
delete table ta
inset into ta(...)
select ..... from #temp
b:用改变表结构(加一个唯一字段)来实现
alter table 表 add newfield int identity(1,1)
delete 表
where newfield not in
(
select min(newfield) from 表 group by 除newfield外的所有字 段
)
alter table 表 drop column newfield
SQL命令删除一个表中相同记录
首先问题描述:
一般数据库中表在设计时都会有主键来约束相同记录,但由于从外部数据源导入或其它原因造成一张表中大量相同记录的问题,可以通过SQL语句实 现去除相同记录的操作:
状况一:表中主键是自动编号列ID,但实际数据存在大量重复,如果重复记录是有规律的可以通过ID值运算处理,但如果记录重复频率不一,并且数据 量很多的情况下通过企业管理器手工删除是繁琐的,如果使用SQL命令,只需一句即可完成。
数据格式如下表所示:
IDStuIDStuNameStuSexStuAddressStuMail
11001张扬男因果巷1号zy@163.com
21001张扬男因果巷1号zy@163.com
31002张律男虎丘路9号zl@eyou.com.cn
41002张律男虎丘路9号zl@eyou.com.cn
51002张律男虎丘路9号zl@eyou.com.cn
61003沈娴华女东环路36号sxh@163.com
71003沈娴华女东环路36号sxh@163.com
81003沈娴华女东环路36号sxh@163.com
91004杜岗男南园南路30号dgang@oceansoft.com
101004杜岗男南园南路30号dgang@oceansoft.com
111005许增英女人民路48-6号xzy@eyou.com
121005许增英女人民路48-6号xzy@eyou.com
具体SQL命令语句:
DELETE FROM Student WHERE ID NOT IN (SELECT MAX(ID) FROM Student GROUP BY stuID,StuName,StuSex,StuAddress)
这样可以把每行除ID列以外所有相同的数据行中,只保留ID值最大的记录,其余全部删除
当然,也可以保留ID列最小的记录行,只需改为MIN(ID)即可 :
DELETE FROM Student WHERE ID NOT IN (SELECT MIN(ID) FROM Student GROUP BY stuID,StuName,StuSex,StuAddress)
状况二:表中未设主键,造成记录的重复(在SQL2000企业管理器中无法删除,只能通过查询分析器实现)
数据格式如下表所示:
StuIDStuNameStuSexStuAddressStuMail
1001张扬男因果巷1号zy@163.com
1001张扬男因果巷1号zy@163.com
1002张律男虎丘路9号zl@eyou.com.cn
1002张律男虎丘路9号zl@eyou.com.cn
1002张律男虎丘路9号zl@eyou.com.cn
1003沈娴华女东环路36号sxh@163.com
1003沈娴华女东环路36号sxh@163.com
1003沈娴华女东环路36号sxh@163.com
1004杜岗男南园南路30号dgang@oceansoft.com
1004杜岗男南园南路30号dgang@oceansoft.com
1005许增英女人民路48-6号xzy@eyou.com
1005许增英女人民路48-6号xzy@eyou.com
这种情况,可以通过生成新表的方式实现:筛选出不同的记录(Distinct)插入新表(NewStudent)
SELECT DISTINCT * INTO NewStudent FROM Student
使用SQL命令删除表中相同记录
帮助文件中有关 DELETE 方法的示例非常值得借鉴:
SQL命令删除一个表中相同记录示例
本示例删除 Sheet1 的 A1:D10 单元格区域,并将其右侧单元格向左移位。
Worksheets("Sheet1").Range("A1:D10").Delete Shift:=xlShiftToLeft
本示例删除活动工作簿的 Sheet3 工作表,并且不显示确认对话框。
Application.DisplayAlerts = FalseWorksheets("Sheet3").DeleteApplication.DisplayAlerts = True
本示例在指定工作表的列中对数据进行排序,然后删除包含重复数据的行。
Worksheets("Sheet1").Range("A1:D10").Delete Shift:=xlShiftToLeft 本示例 删除活动工作簿的 Sheet3 工作表,并且不显示确认对话框。
Application.DisplayAlerts = False Worksheets("Sheet3").Delete Application.DisplayAlerts = True 本 示例在指定工作表的列中对数据进行排序,然后删除包含重复数据的行。
Sub DeleteColumnDupes(strSheetName As String, strColumnLetter As String) Dim strColumnRange As String Dim rngCurrentCell As Range Dim rngNextCell As Range strColumnRange = strColumnLetter & "1" Worksheets(strSheetName).Range(strColumnRange).Sort _ Key1:=Worksheets(strSheetName).Range(strColumnRange) Set rngCurrentCell = Worksheets(strSheetName).Range(strColumnRange) Do While Not IsEmpty(rngCurrentCell) Set rngNextCell = rngCurrentCell.Offset(1, 0) If rngNextCell.Value = rngCurrentCell.Value Then rngCurrentCell.EntireRow.Delete End If Set rngCurrentCell = rngNextCell Loop End Sub