我的漫漫程序之旅

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

          SQL:刪除表中重復的記錄

          /**
          **刪除表中的重復記錄
          **@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)
          )

          --插入幾條測試數據
          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'

          --查看當前記錄
          select * from test

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





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

          2、刪除表中多余的重復記錄,重復記錄是根據單個字段(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、查找表中多余的重復記錄(多個字段) 
          select * from vitae a 
          where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*> 1

          4、刪除表中多余的重復記錄(多個字段),只留有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、查找表中多余的重復記錄(多個字段),不包含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表中存在一個字段“name”,而且不同記錄之間的“name”值有可能會相同, 
          現(xiàn)在就是需要查詢出在該表中的各記錄之間,“name”值存在重復的項; 
          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 々上善若水々 閱讀(823) 評論(1)  編輯  收藏 所屬分類: 數據庫

          評論

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

          不錯,謝謝分享。
          2008-11-03 17:47 | angel
          主站蜘蛛池模板: 嘉黎县| 黎川县| 黄山市| 高要市| 巩义市| 慈溪市| 军事| 田林县| 肥西县| 金阳县| 高陵县| 河西区| 宝应县| 广昌县| 龙里县| 黑山县| 黄梅县| 利津县| 彰化县| 玉溪市| 晋州市| 石柱| 巴南区| 蓬安县| 镇江市| 黔东| 郧西县| 肥东县| 湟中县| 蓬安县| 陆丰市| 宁武县| 探索| 光泽县| 德昌县| 三江| 苏州市| 遂川县| 益阳市| 内黄县| 城步|