SQL命令删除一个表中相同记录

简介: SQL命令删除一个表中相同记录    0 推荐 删除重复数据           一、具有主键的情况      a.具有唯一性的字段id(为唯一主键)      delect   table        where   id   not   in...

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

目录
相关文章
|
30天前
|
SQL 存储 数据库
新建数据集SQL命令详解及技巧
在数据库管理中,新建数据集(即创建新表)是常见的操作之一
|
6月前
|
SQL 关系型数据库 MySQL
SQL命令
【5月更文挑战第21天】SQL命令
45 3
|
1月前
|
SQL 安全 关系型数据库
sql注入原理和sqlmap命令的基础命令以及使用手法
sql注入原理和sqlmap命令的基础命令以及使用手法
|
4月前
|
存储 关系型数据库 MySQL
(十五)MySQL命令大全:以后再也不用担心忘记SQL该怎么写啦~
相信大家在编写SQL时一定有一个困扰,就是明明记得数据库中有个命令/函数,可以实现自己需要的功能,但偏偏不记得哪个命令该怎么写了,这时只能靠盲目的去百度,以此来寻找自己需要的命令。
152 28
|
3月前
|
SQL 数据库 开发者
深入理解SQL中的ALIAS命令
【8月更文挑战第31天】
77 0
|
3月前
|
SQL 存储 关系型数据库
|
4月前
|
SQL 数据库 索引
SQL 命令
【7月更文挑战第10天】SQL 命令。
33 3
|
6月前
|
SQL 关系型数据库 MySQL
sql数据库命令
SQL(Structured Query Language,结构化查询语言)是用于管理关系数据库的标准编程语言。以下是一些常用的 SQL 数据库命令: 1. **创建数据库**: ``
51 7
|
5月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错合集之在本地执行代码没有问题,但是在线执行sql命令就会报错,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
130 0
|
6月前
|
机器学习/深度学习
T-sql 各种查询命令
T-sql 各种查询命令

热门文章

最新文章

下一篇
无影云桌面