首页 电脑 电脑学堂 查看内容

在SQL中删除重复记录

2009-3-22 09:05 641 0

摘要: 平素的工作中写的最多的脚本是SQL的,在处理客户的业务过程中会遇到各种各样式的新需求。有时客户所要求的问题处理速度则是最关键的——索性将些类问题的各种处理方法整理出来,保存于此以备COPY! ...
关键词: nbsp 重复 字段 select employee EMP NAME 方法 SALARY autoID

平素的工作中写的最多的脚本是SQL的,在处理客户的业务过程中会遇到各种各样式的新需求。有时客户所要求的问题处理速度则是最关键的——索性将些类问题的各种处理方法整理出来,保存于此以备COPY!    第一种情况的处理方法如下:    (—)在Oracle中,可以通过唯一rowid实现删除重复记录;可以通过下面的语句查询重复的记录: 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                                         20000SQL> 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); SQL> select * from employee    1 sunshine                    10000        3 xyz                                             30000       2 semon                                         20000          (二)通过建立临时表来实现 SQL>create table temp_emp as (select distinct * from employee)  SQL>truncate table employee; (清空employee表的数据)SQL>insert into employee select * from temp_emp; (再将临时表里的内容插回来)  数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……   方法一 declare @max integer,@id integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0beginselect @max = @max -1set rowcount @maxdelete from 表名 where 主字段 = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0   方法二  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。  1、对于第一种重复,比较容易解决,使用 select distinct * from tableName   就可以得到无重复记录的结果集。  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除 select distinct * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table #Tmp   发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集 select identity(int,1,1) as autoID, * into #Tmp from tableNameselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoIDselect * from #Tmp where autoID in(select autoID from #tmp2)   最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部