如何删除数据库中的重复行

如何删除数据库中的重复行,第1张

重复行就是有两条记录是一样的,如果该表有主键,那重复行就是除了主键之外其余列的值完全相同。为啥表中会出现重复行?按照我的看法,应该是只有两个途径:1.程序逻辑错误,2.用户的 *** 作问题。程序逻辑错误,那没啥好说的,只要能发现修改其他也挺简单的;用户不知情的情况下添加了相同的数据,比如我的系统中有个把联系人从excel文件导入数据库的功能,导入会耗时,抑或是界面卡住,用户可能没耐心再次点击导入,数据就重复导入了。当然我的问题很好解决,,因为是导入所以那些数据都是相邻的,况且我的每个表都有一个自增的id字段,所以,直接写个sql语句把那堆数据删掉(delete table where id x and id <y)当然解决问题的方式多种多样,我介绍另一种比较有技术含量一点的,因为不是每次数据库重复行都像是我这种情况,有时候重复行数目不定,在数据库中的位置是离散的,用下面的sql语句有点可行Delete table where Id not in (select max(ID) from User group by field)我稍微解释一下上面这句的含义,1.以某个字段为分组依据,相同的数据就被分到一组,2.取得每个分组的最大id,也就是得到数据库行唯一的id集合,3.删除不在这个id集合的数据库行。。。。等等,如果直接拿上面的sql语句去数据库中运行,那会有大麻烦,为啥呢?因为,我们不能确定某个字段值在表中是否是唯一的,比如名字,总有同名的人存在,,,额,你可能会说:id就不会重复了,但是对我们这个有啥意义,如果在数据库中id被设置成唯一的,那根本就不可能存在重复的id,你在插入重复的id时,数据库已经报错不允许你插入,也就不会出现重复了。。。。所以说上面的sql有点小问题,正确的思路就是把上面的第1步改为:根据表中除唯一键之外的所有字段进行分组。就能完美的删除表中的重复行了,,,不过,这个性能嘛。。。。当我没说。。。。

方法一

declare @max integer,@id integer

declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 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

fetch cur_rows into @id,@max

end

close cur_rows

set rowcount 0

方法二

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用 select distinct * from tableName 就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #Tmp from tableName

drop table tableName

select * into tableName from #Tmp

drop table #Tmp

发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录, *** 作方法如下:

假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

select * from #Tmp where autoID in(select autoID from #tmp2)

最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

法一:

用Group

by语句

此查找很快的select

count(num),

max(name)

from

student

–查找表中num列重复的,列出重复的记录数,并列出他的name属性group

by

numhaving

count(num)

>1

–按num分组后找出表中num列重复,即出现次数大于一次delete

from

student(上面Select的)这样的话就把所有重复的都删除了。—–慎重法二:当表比较大(例如10万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法:—-

执行下面SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录SELECT

*

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

D

–D相当于First,SecondWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)—-

执行下面SQL语句后就可以删除所有DRAWING和DSNO相同且重复的记录DELETE

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

DWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)法一:

用Group

by语句

此查找很快的select

count(num),

max(name)

from

student

–查找表中num列重复的,列出重复的记录数,并列出他的name属性group

by

numhaving

count(num)

>1

–按num分组后找出表中num列重复,即出现次数大于一次delete

from

student(上面Select的)这样的话就把所有重复的都删除了。—–慎重法二:当表比较大(例如10万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法:—-

执行下面SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录SELECT

*

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

D

–D相当于First,SecondWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)—-

执行下面SQL语句后就可以删除所有DRAWING和DSNO相同且重复的记录DELETE

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

DWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9941857.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存