当前位置:  数据库>sqlserver

sql语句如何删除重复记录?四种方法

    来源: 互联网  发布时间:2014-08-29

    本文导语:  本节内容: sql语句删除重复记录的四种方法 问题:如何把具有相同字段的记录删除,只留下一条。   例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。name的内容不定,相同的记录数不定。   sql...

本节内容:
sql语句删除重复记录的四种方法

问题:如何把具有相同字段的记录删除,只留下一条。
 
例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。name的内容不定,相同的记录数不定。
 
sql语句删除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

更多sql语句的用法,请移步至sql语句大全,查阅更详细的介绍。
 
方法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原表中重复的值。

在sql中删除重复记录(多种方法)

在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现.
以表employee为例。
 

SQL> desc employee
 Name                                      Null?    Type
----------------------------------------- -------- ------------------

emp_id                                                NUMBER(10)
emp_name                                           VARCHAR2(20)
salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:
 

SQL> select * from employee;
    EMP_ID EMP_NAME                                  SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         1 sunshine                                      10000
         2 semon                                         20000
         2 semon                                         20000
         3 xyz                                           30000
         2 semon                                         20000
SQL> select distinct * from employee;

    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         2 semon                                         20000
         3 xyz                                             30000
SQL>  select * from employee group by emp_id,emp_name,salary having count (*)>1

    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         2 semon                                          20000

SQL> select * from employee e1
where rowid in (select max(rowid) from employe e2
 where e1.emp_id=e2.emp_id and
  e1.emp_name=e2.emp_name and e1.salary=e2.salary);
    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         3 xyz                                             30000
         2 semon                                         20000

2. 删除的几种方法:
1)通过建立临时表来实现
 

SQL>create table temp_emp as (select distinct * from employee)
SQL> truncate table employee; (清空employee表的数据)

SQL> insert into employee select * from temp_emp;  (再将临时表里的内容插回来)

2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。
 

SQL>delete from employee e2 where rowid not in (
        select max(e1.rowid) from employee e1 where
        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。
SQL>delete from employee e2 where rowid delete from employee where rowid not in (
        select max(t1.rowid) from employee t1 group by
         t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。
    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         3 xyz                                             30000
         2 semon                                         20000
 

SQL> desc employee

 Name                                      Null?    Type
----------------------------------------- -------- ------------------

emp_id                                                NUMBER(10)
emp_name                                           VARCHAR2(20)
salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:
 

SQL> select * from employee;

    EMP_ID EMP_NAME                                  SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         1 sunshine                                      10000
         2 semon                                         20000
         2 semon                                         20000
         3 xyz                                           30000
         2 semon                                         20000


SQL> select distinct * from employee;

    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         2 semon                                         20000
         3 xyz                                             30000
SQL>  select * from employee group by emp_id,emp_name,salary having count (*)>1

    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         2 semon                                          20000

SQL> select * from employee e1
where rowid in (select max(rowid) from employe e2
 where e1.emp_id=e2.emp_id and
  e1.emp_name=e2.emp_name and e1.salary=e2.salary);
    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         3 xyz                                             30000
         2 semon                                         20000
 

2. 删除的几种方法:
1)通过建立临时表来实现
 

SQL>create table temp_emp as (select distinct * from employee)
SQL> truncate table employee; (清空employee表的数据)

SQL> insert into employee select * from temp_emp;  (再将临时表里的内容插回来)

2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。
 

SQL>delete from employee e2 where rowid not in (
        select max(e1.rowid) from employee e1 where
        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。
SQL>delete from employee e2 where rowid delete from employee where rowid not in (
        select max(t1.rowid) from employee t1 group by
         t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。
    EMP_ID EMP_NAME                                     SALARY
---------- ---------------------------------------- ----------
         1 sunshine                                      10000
         3 xyz                                             30000
         2 semon                                         20000

    
 
 

您可能感兴趣的文章:

  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Mysql增加主键或者更改表的列为主键的sql语句
  • sql语句实例 取得日志条目的sql语句
  • Mysql下在某一列后即表的某一位置添加新列的sql语句
  • SQL Server统计SQL语句执行时间的脚本
  • c/c++ iis7站长之家
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • 一条SQL语句搞定Sql2000 分页
  • C#中验证sql语句是否正确(不执行语句)
  • SQL Server数据库的修复SQL语句
  • SQL 语句拦截 P6SPY
  • C#使用带like的sql语句时防sql注入的方法
  • t-sql/mssql用命令行导入数据脚本的SQL语句示例
  • 在SQL Server的try...catch语句中获取错误消息代码的的语句
  • sql2005创建远程登录帐户的sql语句分享
  • SQL SERVER 查询正在实行的SQL语句
  • SQL语句中含有乘号报错的处理办法
  • sql无效字符引起的执行sql语句报错的解决方法
  • C#代码验证sql语句是否正确(只验证不执行sql)的方法
  • SQL Server中选出指定范围行的SQL语句代码
  • sql server 删除表1某些数据的同时自动删除表2的相关数据的sql代码
  • 安装SQL2008时提示删除SQL2005Express工具的解决方法
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)
  • sql语言中delete删除命令语句详解
  • 重装MS SQL Server 2000前必须彻底删除原安装文件的方法
  • Sql Server 2000删除数据库备份文件
  • sql 存储过程批量删除数据的语句
  • Sql Server 删除主键与重建主键的例子
  • jsp+SQL删除记录出错,请指教!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SQL语句去掉重复记录,获取重复记录
  • sql语句怎么写:将table中字段name='string1'的记录都改为name='string2'的记录
  • SQL查找某一条记录的方法
  • sql 查询记录数结果集某个区间内记录
  • 当ResultSet执行SQL成功后,我如何取得ResultSet的记录部条数
  • ResultSet rs = stmt.executeQuery(sql),如果该sql的结果是没有符合的记录,那么rs此时是什么东东?是null吗?如果不是,如何判断是空resultset?
  • sql面试题(查看数据中指定几行记录)
  • 从每个分类选择10条记录的sql语句
  • sql面试题(查看自动编号数据中指定几行记录)
  • 如何实现图片上传啊,而且我想把它记录在SQL SERVER中!!有空请帮我!!!
  • 如何得到返回记录集的总条数???sql问题,求助!!!
  • 哪位能提供一个支持滚动记录集的MS SQL Server2000的JDBC驱动程序???
  • 怎样用SQL语句得到查询结果的记录数?100fen
  • SQL 重复记录问题的处理方法小结
  • SQL 统计一个数据库中所有表记录的数量
  • SQL语句查询数据库中重复记录的个数
  • sql server获得新记录标识列值的二种方法
  • SQL一条语句统计记录总数及各状态数
  • SQL语句练习实例之七 剔除不需要的记录行
  • 在查询结果中添加一列表示记录的行数的sql语句
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3