如何查找和删除数据库中的重复数据

如何查找和删除数据库中的重复数据,第1张

法一: 用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_PREFABDRAWING=DDRAWING ANDEM5_PIPE_PREFABDSNO=DDSNO);—- 执行下面SQL语句后就可以删除所有DRAWING和DSNO相同且重复的记录DELETE FROM EM5_PIPE_PREFABWHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB DWHERE EM5_PIPE_PREFABDRAWING=DDRAWING ANDEM5_PIPE_PREFABDSNO=DDSNO);法一: 用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_PREFABDRAWING=DDRAWING ANDEM5_PIPE_PREFABDSNO=DDSNO);—- 执行下面SQL语句后就可以删除所有DRAWING和DSNO相同且重复的记录DELETE FROM EM5_PIPE_PREFABWHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB DWHERE EM5_PIPE_PREFABDRAWING=DDRAWING ANDEM5_PIPE_PREFABDSNO=DDSNO);

MySql避免重复插入记录的几种方法

本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,有需要的朋友可以参考一下

方案一:使用ignore关键字

如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:

复制代码 代码如下:

INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test9@163com', '99999', '9999');

这样当有重复记录就会忽略,执行后返回数字0

还有个应用就是复制表,避免重复记录:

复制代码 代码如下:

INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`;

方案二:使用Replace

语法格式:

复制代码 代码如下:

REPLACE INTO `table_name`(`col_name`, ) VALUES ();

REPLACE INTO `table_name` (`col_name`, ) SELECT ;

REPLACE INTO `table_name` SET `col_name`='value',

算法说明:

REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:

尝试把新行插入到表中

当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:

从表中删除含有重复关键字值的冲突行

再次尝试把新行插入到表中

旧记录与新记录有相同的值的判断标准就是:

表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

返回值:

REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和

受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。

示例:

# eg:(phone字段为唯一索引)

复制代码 代码如下:

REPLACE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test569', '99999', '123');

另外,在 SQL Server 中可以这样处理:

复制代码 代码如下:

if not exists (select phone from t where phone= '1') insert into t(phone, update_time) values('1', getdate()) else update t set update_time = getdate() where phone= '1'

更多信息请看:>

1先将umane用一个临时表存起来

select distinct(uname) uname into #a form users

2删除users表内的数据

delete from users

3把临时表用户加到users表中,并将默认upwd全设为1234要看你upwd是什么数据类型 如果是数字的就

insert users select uname,1234 from #a

是字符型的

insert users select uname,'1234' from #a

4最后删除临时表

drop table #a

这样所有人的初始密码都变为1234

--按某一字段分组取最大(小)值所在行的数据

/

数据如下:

name val memo

a 2 a2(a的第二个值)

a 1 a1--a的第一个

a 3 a3:a的第三个

b 1 b1--b的第一个值

b 3 b3:b的第三个值

b 2 b2b2b2b2

b 4 b4b4

b 5 b5b5b5b5b5

/

--创建表并插入数据:

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a', 2, 'a2(a的第二个值)')

insert into tb values('a', 1, 'a1--a的第一个值')

insert into tb values('a', 3, 'a3:a的第三个值')

insert into tb values('b', 1, 'b1--b的第一个值')

insert into tb values('b', 3, 'b3:b的第三个值')

insert into tb values('b', 2, 'b2b2b2b2')

insert into tb values('b', 4, 'b4b4')

insert into tb values('b', 5, 'b5b5b5b5b5')

go

--一、按name分组取val最大的值所在行的数据。

--方法1:

select a from tb a where val = (select max(val) from tb where name = aname) order by aname

--方法2:

select a from tb a where not exists(select 1 from tb where name = aname and val > aval)

--方法3:

select a from tb a,(select name,max(val) val from tb group by name) b where aname = bname and aval = bval order by aname

--方法4:

select a from tb a inner join (select name , max(val) val from tb group by name) b on aname = bname and aval = bval order by aname

--方法5

select a from tb a where 1 > (select count() from tb where name = aname and val > aval ) order by aname

/

name val memo

---------- ----------- --------------------

a 3 a3:a的第三个值

b 5 b5b5b5b5b5

/

--二、按name分组取val最小的值所在行的数据。

--方法1:

select a from tb a where val = (select min(val) from tb where name = aname) order by aname

--方法2:

select a from tb a where not exists(select 1 from tb where name = aname and val < aval)

--方法3:

select a from tb a,(select name,min(val) val from tb group by name) b where aname = bname and aval = bval order by aname

--方法4:

select a from tb a inner join (select name , min(val) val from tb group by name) b on aname = bname and aval = bval order by aname

--方法5

select a from tb a where 1 > (select count() from tb where name = aname and val < aval) order by aname

/

name val memo

---------- ----------- --------------------

a 1 a1--a的第一个值

b 1 b1--b的第一个值

/

--三、按name分组取第一次出现的行所在的数据。

select a from tb a where val = (select top 1 val from tb where name = aname) order by aname

/

name val memo

---------- ----------- --------------------

a 2 a2(a的第二个值)

b 1 b1--b的第一个值

/

--四、按name分组随机取一条数据。

select a from tb a where val = (select top 1 val from tb where name = aname order by newid()) order by aname

/

name val memo

---------- ----------- --------------------

a 1 a1--a的第一个值

b 5 b5b5b5b5b5

/

--五、按name分组取最小的两个(N个)val

select a from tb a where 2 > (select count() from tb where name = aname and val < aval ) order by aname,aval

select a from tb a where val in (select top 2 val from tb where name=aname order by val) order by aname,aval

select a from tb a where exists (select count() from tb where name = aname and val < aval having Count() < 2) order by aname

/

name val memo

---------- ----------- --------------------

a 1 a1--a的第一个值

a 2 a2(a的第二个值)

b 1 b1--b的第一个值

b 2 b2b2b2b2

/

--六、按name分组取最大的两个(N个)val

select a from tb a where 2 > (select count() from tb where name = aname and val > aval ) order by aname,aval

select a from tb a where val in (select top 2 val from tb where name=aname order by val desc) order by aname,aval

select a from tb a where exists (select count() from tb where name = aname and val > aval having Count() < 2) order by aname

/

name val memo

---------- ----------- --------------------

a 2 a2(a的第二个值)

a 3 a3:a的第三个值

b 4 b4b4

b 5 b5b5b5b5b5

/

--七,如果整行数据有重复,所有的列都相同。

/

数据如下:

name val memo

a 2 a2(a的第二个值)

a 1 a1--a的第一个值

a 1 a1--a的第一个值

a 3 a3:a的第三个值

a 3 a3:a的第三个值

b 1 b1--b的第一个值

b 3 b3:b的第三个值

b 2 b2b2b2b2

b 4 b4b4

b 5 b5b5b5b5b5

/

--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。

--创建表并插入数据:

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a', 2, 'a2(a的第二个值)')

insert into tb values('a', 1, 'a1--a的第一个值')

insert into tb values('a', 1, 'a1--a的第一个值')

insert into tb values('a', 3, 'a3:a的第三个值')

insert into tb values('a', 3, 'a3:a的第三个值')

insert into tb values('b', 1, 'b1--b的第一个值')

insert into tb values('b', 3, 'b3:b的第三个值')

insert into tb values('b', 2, 'b2b2b2b2')

insert into tb values('b', 4, 'b4b4')

insert into tb values('b', 5, 'b5b5b5b5b5')

go

select , px = identity(int,1,1) into tmp from tb

select mname,mval,mmemo from

(

select t from tmp t where val = (select min(val) from tmp where name = tname)

) m where px = (select min(px) from

(

select t from tmp t where val = (select min(val) from tmp where name = tname)

) n where nname = mname)

drop table tb,tmp

/

name val memo

---------- ----------- --------------------

a 1 a1--a的第一个值

b 1 b1--b的第一个值

(2 行受影响)

/

--在sql server 2005中可以使用row_number函数,不需要使用临时表。

--创建表并插入数据:

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a', 2, 'a2(a的第二个值)')

insert into tb values('a', 1, 'a1--a的第一个值')

insert into tb values('a', 1, 'a1--a的第一个值')

insert into tb values('a', 3, 'a3:a的第三个值')

insert into tb values('a', 3, 'a3:a的第三个值')

insert into tb values('b', 1, 'b1--b的第一个值')

insert into tb values('b', 3, 'b3:b的第三个值')

insert into tb values('b', 2, 'b2b2b2b2')

insert into tb values('b', 4, 'b4b4')

insert into tb values('b', 5, 'b5b5b5b5b5')

go

select mname,mval,mmemo from

(

select , px = row_number() over(order by name , val) from tb

) m where px = (select min(px) from

(

select , px = row_number() over(order by name , val) from tb

) n where nname = mname)

drop table tb

/

name val memo

---------- ----------- --------------------

a 1 a1--a的第一个值

b 1 b1--b的第一个值

(2 行受影响)

/

如何查找和删除数据库中的重复数据

以Excel2010版本为例,可以直接使用数据→删除重复项的功能来实现删除重复数据。

此功能Excel2007及以上版本均可,WPS中也有这样的功能。另外还可以使用公式法去重复,常用的函数是Countif函数。

有两个意义上的重复记录

①完全重复的记录,也即所有字段均重复的记录。

②部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用

select distinct  from tableName

这样就可以得到无重复记录的结果集。然后通过临时表实现对数据的维护。

select distinct  into #Tmp from tableName

drop table tableName

select  into tableName from #Tmp

drop table #Tmp

#Tmp为什么系统参数,tableName为要 *** 作的表名。

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子句中省去此列)

以上就是关于如何查找和删除数据库中的重复数据全部的内容,包括:如何查找和删除数据库中的重复数据、如何避免向数据库插入重复记录、求删除SQL数据库中某个表的重复数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/sjk/9678193.html

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

发表评论

登录后才能评论

评论列表(0条)

保存