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


    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

  • 相关阅读:
    [20171121]rman backup as copy 2.txt
    [20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt
    [20171120]理解v$session的state字段(11G).txt
    [20171120]11G关闭直接路径读.txt
    [20171120]bash使用here documents的一个小细节.txt
    [20171120]关于find 软连接问题.txt
    [20171120]11g select for update skip locked.txt
    [20171115]ZEROCONF ROUTE.txt
    [20171113]修改表结构删除列相关问题4.txt
    [20171110]sql语句相同sql_id可以不同吗.txt
  • 原文地址:https://www.cnblogs.com/y0umer/p/3839417.html
Copyright © 2020-2023  润新知