SQL 删除重复记录
Code
SQL Server中删除重复数据的几个方法
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
方法一
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子句中省去此列)
---------------------------------我是可爱的分割线---------------------------------
SQL DISTINCT重复的数据统计方法 group by 重复数据的个数统计 删除重复的数据
DISTINCT 关键字可从 SELECT 语句的结果中除去重复的行。如果没有指定 DISTINCT,那么将返回所有行,包括重复的行。
select count(distinct t.destaddr) from nbyd_send t where t.input_time > to_date('2007-2-1','yyyy-mm-dd') and t.input_time < to_date('2007-3-1','yyyy-mm-dd')
可以统计出一个月中的用户数量。
关于如何快速得知里面每一个号码重复的个数问题的解答:利用分组函数的SQL语句
select t.tel,count(*) from nbyd_deliver t group by t.tel ;group by 解决重复数据的个数统计适用于各种关系型数据库,如oracle,SQL Server
查询重复的数据
select * from (select v.xh,count(v.xh) num from sms.vehicle v group by v.xh) where num>1;--169
select v.xh,count(v.xh) num from sms.vehicle v group by v.xh having count(v.xh)=2;
删除重复的数据
create table mayong as (select distinct* from sms.vehicle);
delete from sms.vehicle ;
insert into sms.vehicle select * from mayong;
在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。
下面是查询重复数据的一个例子:
select a.rowid,a.* from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。
而外面就是查询出除了rowid最大之外的其他重复的数据了。
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
delete from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。
create table 临时表 as
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
delete from 表名 a
where a.rowid !=
(
select b.dataid from 临时表 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
);
commit;
二、对于完全重复记录的删除
对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:
select distinct * from 表名
可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:
CREATE TABLE 临时表 AS (select distinct * from 表名);
drop table 正式表;
insert into 正式表 (select * from 临时表);
drop table 临时表;
如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:
INSERT INTO t_table_bak
select distinct * from t_table;
---------------------------------我是可爱的分割线---------------------------------
SQL Server中删除重复数据最快的方法
由于种种原因,在数据库中出现了我们不希望出现的重复数据,当对这些重复的数据进行删除的时候有许多种方法。我发现在网上流行的一种方法是利用临时表的方法,SQL脚本如下:
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
该方法首先使用select distinct命令将不重复的列表数据写入到临时表#Tmp中,然后删除原来的表,再将临时表中的数据写入到tableName中,最后删除临时表。
但是这种方法执行效率是一个方面,另外如果数据库中有text类型的字段的话将不能执行,非常的有局限性。
下面提供一个通用的方法并且执行效率也是非常不错的,教本如下:
下载: cleanRepeatedRows2.sql
declare @max int,@rowname varchar(400)
declare cur_rows cursor local for
select repeatedrow,count(*) from tableName group by repeatedrow having count(*) > 1
open cur_rows
fetch cur_rows into @rowname ,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from tableName where repeatedrow = @rowname
fetch cur_rows into @rowname ,@max
end
close cur_rows
set rowcount 0简单说明一下:首先声明了两个变量,一个是记录重复的数量,另外一个是记录重复字段的值,变量的类型以及长度可根据你实际的字段进行定义;接下来声明一个游标,该游标主要是列出重复的数据以及重复的数
量;然后打开游标并从中取出数据,其中“select @max = @max -1”这句的意思是保留一条重复数据,剩下的逐一删除;最后关闭游标,搞定。
执行完教本之后可以使用下面的教本检查是否含有重复的数据:
select repeatedrow,count(*) from tableName group by repeatedrow having count(*) > 1
SQL Server中删除重复数据的几个方法
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
方法一
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子句中省去此列)
---------------------------------我是可爱的分割线---------------------------------
SQL DISTINCT重复的数据统计方法 group by 重复数据的个数统计 删除重复的数据
DISTINCT 关键字可从 SELECT 语句的结果中除去重复的行。如果没有指定 DISTINCT,那么将返回所有行,包括重复的行。
select count(distinct t.destaddr) from nbyd_send t where t.input_time > to_date('2007-2-1','yyyy-mm-dd') and t.input_time < to_date('2007-3-1','yyyy-mm-dd')
可以统计出一个月中的用户数量。
关于如何快速得知里面每一个号码重复的个数问题的解答:利用分组函数的SQL语句
select t.tel,count(*) from nbyd_deliver t group by t.tel ;group by 解决重复数据的个数统计适用于各种关系型数据库,如oracle,SQL Server
查询重复的数据
select * from (select v.xh,count(v.xh) num from sms.vehicle v group by v.xh) where num>1;--169
select v.xh,count(v.xh) num from sms.vehicle v group by v.xh having count(v.xh)=2;
删除重复的数据
create table mayong as (select distinct* from sms.vehicle);
delete from sms.vehicle ;
insert into sms.vehicle select * from mayong;
在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。
下面是查询重复数据的一个例子:
select a.rowid,a.* from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。
而外面就是查询出除了rowid最大之外的其他重复的数据了。
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
delete from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。
create table 临时表 as
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
delete from 表名 a
where a.rowid !=
(
select b.dataid from 临时表 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
);
commit;
二、对于完全重复记录的删除
对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:
select distinct * from 表名
可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:
CREATE TABLE 临时表 AS (select distinct * from 表名);
drop table 正式表;
insert into 正式表 (select * from 临时表);
drop table 临时表;
如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:
INSERT INTO t_table_bak
select distinct * from t_table;
---------------------------------我是可爱的分割线---------------------------------
SQL Server中删除重复数据最快的方法
由于种种原因,在数据库中出现了我们不希望出现的重复数据,当对这些重复的数据进行删除的时候有许多种方法。我发现在网上流行的一种方法是利用临时表的方法,SQL脚本如下:
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
该方法首先使用select distinct命令将不重复的列表数据写入到临时表#Tmp中,然后删除原来的表,再将临时表中的数据写入到tableName中,最后删除临时表。
但是这种方法执行效率是一个方面,另外如果数据库中有text类型的字段的话将不能执行,非常的有局限性。
下面提供一个通用的方法并且执行效率也是非常不错的,教本如下:
下载: cleanRepeatedRows2.sql
declare @max int,@rowname varchar(400)
declare cur_rows cursor local for
select repeatedrow,count(*) from tableName group by repeatedrow having count(*) > 1
open cur_rows
fetch cur_rows into @rowname ,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from tableName where repeatedrow = @rowname
fetch cur_rows into @rowname ,@max
end
close cur_rows
set rowcount 0简单说明一下:首先声明了两个变量,一个是记录重复的数量,另外一个是记录重复字段的值,变量的类型以及长度可根据你实际的字段进行定义;接下来声明一个游标,该游标主要是列出重复的数据以及重复的数
量;然后打开游标并从中取出数据,其中“select @max = @max -1”这句的意思是保留一条重复数据,剩下的逐一删除;最后关闭游标,搞定。
执行完教本之后可以使用下面的教本检查是否含有重复的数据:
select repeatedrow,count(*) from tableName group by repeatedrow having count(*) > 1