zoukankan      html  css  js  c++  java
  • Sql server 删除重复记录的SQL语句 枫

    有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
    1、对于第一种重复,比较容易解决,使用
    select distinct * from tableName
    就可以得到无重复记录的结果集。
    如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
    select distinct * into #Tmp from tableName
    drop table tableName
    select * into tableName from #Tmp
    drop table #Tmp
    发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
    2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
    假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
    select identity(int,1,1) as autoID, * into #Tmp from tableName
    select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
    select * from #Tmp where autoID in(select autoID from #tmp2)
    最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
    3、部分关键字段重复,且记录中有ID.
    第一种方法可一次删除所有重复的..(只保留重复中ID最小的记录)。
    delete from table where id not in ( select min(id) from table group by name)
    第二种方法每次只删除重复中ID最大的一条记录。
    delete from table where id in ( select max(id) from table group by name having count(*)>1)
    4、SQL程序删除
    declare @max integer,@id integer
    declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
    open cur_rows
    fetch cur_rows into @id,@max
    while @@fetch_status=0
    begin
    select @max = @max -1
    set rowcount @max
    delete from 表名 where 主字段 = @id
    fetch cur_rows into @id,@max
    end
    close cur_rows
    set rowcount 0

    自己还得出的办法:
    select   *   from   user1     where   [id]   not   in   (select   top   1   [id]   from   user1   a   where   name=user1.name)  
      --删就这样写  
      delete   from   user1     where   [id]   not   in   (select   top   1   [id]   from   user1   a   where   name=user1.name)
    或 delete from user where id not in ( select max(id) from user where name=user.name)
    delete [user] where id not in (select max(id) from [user] group by name having count(*) > 1)
    max 或 min看具体情况而论。

    其他方法:
    ----A:保留id最大的行,删除其它行  
      --方法1  
      delete   [user]   from   [user]   t    
      inner   join(select   name,max(id)   as   id   from   [user]   group   by   name)   a  
      on   t.name   =   a.name   and   t.id   <>   a.id  
      --方法2  
      delete   [user]   from   [user]   t  
      where     exists(select   *   from   [user]   where   name   =   t.name   and   id   >   t.id)  
       
      ----B:保留id最小的行,删除其它行  
      --方法1  
      delete   [user]   from   [user]   t    
      inner   join(select   name,min(id)   as   id   from   [user]   group   by   name)   a  
      on   t.name   =   a.name   and   t.id   <>   a.id  
      --方法2  
      delete   [user]   from   [user]   t  
      where     exists(select   *   from   [user]   where   name   =   t.name   and   id   <   t.id)  
       
      ----C:删除所有重复的name行,一行也不留  
      delete   [user]   from   [user]   t    
      inner   join    
      (select   id   from   [user]   a   where   exists(select   *   from   [user]   where   name   =   a.name   group   by   name   having   count(*)   >   1))   as   b  
      on   t.id   =   b.id
    IOS
  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/mrray/p/2731476.html
Copyright © 2011-2022 走看看