我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          SQL:刪除表中重復(fù)的記錄

          /**
          **刪除表中的重復(fù)記錄
          **@author zdw
          ** 2008 11.03 17:30
          *
          */


          --創(chuàng)建測試表
          if object_id('test'is not null 
            
          drop table test

          create table test
          (
           id 
          int identity(1,1primary key,
           name 
          varchar(50)
          )

          --插入幾條測試數(shù)據(jù)
          insert into test select 'a' union all
          select 'a' union all
          select 'a' union all
          select 'a' union all
          select 'a' union all
          select 'a' union all
          select 'b' union all
          select 'b' union all 
          select 'b' union all 
          select 'b' union all 
          select 'b' union all 
          select 'b' union all
          select 'b' union all
          select 'c' union all 
          select 'c' union all 
          select 'c' union all 
          select 'd' union all 
          select 'd'

          --查看當(dāng)前記錄
          select * from test

          if object_id('#'is not null 
            
          drop table #
          --注意(是單個(gè)字段的不同還是多個(gè)字段,這里是name)
          select distinct (name) into # from test
          --查看新表中的數(shù)據(jù)
          select * from #
          --清空舊表
          truncate table test
          --將新表中的數(shù)據(jù)插入到舊表
          insert test select * from #
          --刪除新表
          drop table #
          --查看結(jié)果
          select * from test





          csdn上秒到的一些方法:
          1、查找表中多余的重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來判斷 
          select * from people 
          where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1

          2、刪除表中多余的重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來判斷,只留有rowid最小的記錄 
          delete from people 
          where peopleId  in (select  peopleId  from people  group  by  peopleId  having  count(peopleId) > 1
          and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1

          3、查找表中多余的重復(fù)記錄(多個(gè)字段) 
          select * from vitae a 
          where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*> 1

          4、刪除表中多余的重復(fù)記錄(多個(gè)字段),只留有rowid最小的記錄 
          delete from vitae a 
          where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*> 1
          and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1

          5、查找表中多余的重復(fù)記錄(多個(gè)字段),不包含rowid最小的記錄 
          select * from vitae a 
          where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*> 1
          and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1

          比方說在A表中存在一個(gè)字段“name”,而且不同記錄之間的“name”值有可能會(huì)相同, 
          現(xiàn)在就是需要查詢出在該表中的各記錄之間,“name”值存在重復(fù)的項(xiàng); 
          Select Name,Count(*From A Group By Name Having Count(*> 1 

          如果還查性別也相同大則如下: 
          Select Name,sex,Count(*From A Group By Name,sex Having Count(*> 1

          還有什么好的解決方法,請大家一起分享。

          posted on 2008-11-03 17:39 々上善若水々 閱讀(822) 評論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          評論

          # re: SQL:刪除表中重復(fù)的記錄[未登錄]  回復(fù)  更多評論   

          不錯(cuò),謝謝分享。
          2008-11-03 17:47 | angel
          主站蜘蛛池模板: 云和县| 正安县| 泰州市| 邢台县| 石家庄市| 永嘉县| 龙陵县| 平和县| 巴南区| 邮箱| 静乐县| 韶山市| 渑池县| 曲沃县| 景德镇市| 新乡县| 东明县| 通山县| 内黄县| 黎城县| 桃源县| 临海市| 伊通| 龙山县| 郧西县| 桐乡市| 称多县| 泰顺县| 玛多县| 高淳县| 丽江市| 赞皇县| 淮安市| 普安县| 东乌| 新巴尔虎右旗| 芜湖县| 抚顺市| 怀仁县| 西乌珠穆沁旗| 亳州市|