用SQL语句删除重复记录的四种好方法

ZDNet软件频道 时间:2009-12-03 作者:林夕 | 赛迪网 我要评论()
本文关键词:Server 服务器 SQL
例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。select [标志字段id],count(*) into temp1 from [表名]insert temp1select [标志字段id],count(*) from [表名]

  问题:如何把具有相同字段的纪录删除,只留下一条。

  例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。name的内容不定,相同的记录数不定。

  SQL语句删除重复记录的四种方法:

  方法1:

  1、将重复的记录记入temp1表:

  select [标志字段id],count(*) into temp1 from [表名]

  group by [标志字段id]

  having count(*)>1

  2、将不重复的记录记入temp1表:

  insert temp1

  select [标志字段id],count(*) from [表名]

  group by [标志字段id]

  having count(*)=1

  3、作一个包含所有不重复记录的表:

  select * into temp2 from [表名]

  where 标志字段id in(select 标志字段id from temp1)

  4、删除重复表:delete [表名]

  5、恢复表:

  insert [表名]

  select * from temp2

  6、删除临时表:

  drop table temp1

  drop table temp2

  方法2:

  declare @max integer,@id integer

  declare cur_rows cursor local for

  select id,count(*) from 表名 group by id 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 = @id

  fetch cur_rows into @id,@max

  end

  close cur_rows

  set rowcount 0

  注:set rowcount @max - 1 表示当前缓冲区只容纳@max-1条记录﹐如果有十条重复的﹐就刪除

  10条,一定会留一条的。也可以写成delete from 表名。

  方法3:

  create table a_dist(id int,name varchar(20))

  insert into a_dist values(1,'abc')

  insert into a_dist values(1,'abc')

  insert into a_dist values(1,'abc')

  insert into a_dist values(1,'abc')

  exec up_distinct 'a_dist','id'

  select * from a_dist

  create procedure up_distinct(@t_name varchar(30)

  ,@f_key varchar(30))

  --f_key表示是分组字段﹐即主键字段

  as

  begin

  declare @max integer,@id varchar(30) ,

  @SQL varchar(7999) ,@type integer

  select @SQL = 'declare cur_rows cursor

  for select '+@f_key+' ,count(*) from '

  +@t_name +' group by ' +@f_key +' having count(*) >1'

  exec(@SQL)

  open cur_rows

  fetch cur_rows into @id,@max

  while @@fetch_status=0

  begin

  select @max = @max -1

  set rowcount @max

  select @type = xtype from syscolumns

  where id=object_id(@t_name) and name=@f_key

  if @type=56

  select @SQL = 'delete from '+@t_name+'

  where ' + @f_key+' = '+ @id

  if @type=167

  select @SQL = 'delete from '+@t_name+'

  where ' + @f_key+' = '+''''+ @id +''''

  exec(@SQL)

  fetch cur_rows into @id,@max

  end

  close cur_rows

  deallocate cur_rows

  set rowcount 0

  end

  select * from systypes

  select * from syscolumns where

  id = object_id('a_dist')

  方法4:

  可以用IGNORE_DUP_KEY:

  create table dup (id int identity not null,

  name varchar(50)not null)

  go

  insert into dup(name) values ('abc')

  insert into dup(name) values ('abc')

  insert into dup(name) values ('abc')

  insert into dup(name) values ('abc')

  insert into dup(name) values ('abc')

  insert into dup(name) values ('abc')

  insert into dup(name) values ('abc')

  insert into dup(name) values ('cdefg')

  insert into dup(name) values ('xyz')

  insert into dup(name) values ('xyz')

  go

  select *

  from dup

  go

  create table tempdb..wk(id int not null,

  name varchar(50)not null)

  go

  create unique index idx_remove_dup

  on tempdb..wk(name)

  with IGNORE_DUP_KEY

  go

  INSERT INTO tempdb..wk (id, name)

  select id, name

  from dup

  go

  select *

  from tempdb..wk

  go

  delete from dup

  go

  set identity_insert dup on

  INSERT INTO dup (id, name)

  select id, name

  from tempdb..wk

  go

  set identity_insert dup off

  go

  select *

  from dup

  go

  注释:此处delete原表,再加入不重复的值。大家也可以通过join只delete原表中重复的值。

Server

服务器

SQL


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134