GVKun编程网logo

sqlserver sql 对重复数据的操作 查找 删除(sql查询删除重复的数据)

19

关于sqlserversql对重复数据的操作查找删除和sql查询删除重复的数据的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于MSSQLSERVER删除重复数据且只保留一条、MySqlSq

关于sqlserver sql 对重复数据的操作 查找 删除sql查询删除重复的数据的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于MS SQLSERVER删除重复数据且只保留一条、MySql SqlServer 根据id删除表中数据的最优方案、mysql-MySQL数据库能转换成SQLServer吗?我有一个MySQL的脚本文件怎么才能在SQLServer里操作、Oracle、SQLServer 删除表中的重复数据,只保留一条记录等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

sqlserver sql 对重复数据的操作 查找 删除(sql查询删除重复的数据)

sqlserver sql 对重复数据的操作 查找 删除(sql查询删除重复的数据)

假设现有一张人员表(表名:Person),若想将姓名、身份证号、住址这三个字段完全相同的记录查找出来,使用

   1:  SELECT p1.*   
   2:  FROM persons   p1,persons   p2   
   3:  WHERE p1.id<>p2.id   
   4:  AND p1.cardid   =   p2.cardid   
   5:  AND p1.pname   =   p2.pname   
   6:  AND p1.address   =   p2.address

可以实现该功能。

删除重复记录的sql语句

1.用rowid方法

2.用group by方法

3.用distinct方法

 

1。用rowid方法

据据Oracle带的rowid属性,进行判断,是否存在重复,语句如下: 
查数据: 
     select * from table1 a where rowid !=(select   max(rowid)   
     from table1 b where a.name1=b.name1 and a.name2=b.name2......) 
删数据: 
    delete   from table1 a where rowid !=(select   max(rowid)   
     from table1 b where a.name1=b.name1 and a.name2=b.name2......)

2.group by方法

查数据: 
select count(num),max(name) from student --列出重复的记录数,并列出他的name属性 
group by num 
having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次 
删数据: 
delete from student 
group by num 
having count(num) >1 
这样的话就把所有重复的都删除了。

3.用distinct方法 -对于小的表比较有用

create table table_new as   select distinct *   from table1 minux 
truncate table table1; 
insert into table1 select * from table_new;

 

查询及删除重复记录的方法大全 
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select * from people 
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 
delete from people 
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1) 
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段) 
select * from vitae a 
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录 
delete from vitae a 
where (a.peopleId,seq having count(*) > 1) 
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录 
select * from vitae a 
where (a.peopleId,seq having count(*)>1)

(二) 比方说 在A表中存在一个字段“name”, 
而且不同记录之间的“name”值有可能会相同, 
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项; 
Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果还查性别也相同大则如下: 
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 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子句中省去此列)

(四) 查询重复

select * from tablename where id in (

select id from tablename

group by id

having count(id) > 1)

MS SQLSERVER删除重复数据且只保留一条

MS SQLSERVER删除重复数据且只保留一条

总结

以上是小编为你收集整理的MS SQLSERVER删除重复数据且只保留一条全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

MySql SqlServer 根据id删除表中数据的最优方案

MySql SqlServer 根据id删除表中数据的最优方案

一个数据表里有上百万条数据。要删除其中满足条件的数据。删除条件是,此表中id等于某些值的数据被删除。这个“某些值”是从另一个同数量级的表中查询出来的。

简单来说,A、B两表外键关联。根据B表的主键来删除A表中的数据。

怎么写sql效率和性能最高。场景是清除历史数据。因此需要删除的数据量很大。

mysql-MySQL数据库能转换成SQLServer吗?我有一个MySQL的脚本文件怎么才能在SQLServer里操作

mysql-MySQL数据库能转换成SQLServer吗?我有一个MySQL的脚本文件怎么才能在SQLServer里操作

mysql

mysql数据库能转换成sqlserver吗?我有一个mysql的脚本文件怎么才能在sqlserver里操作

回复内容:

MySQL 全库导出,修改 一些建表语句就可了,任何数据库都可以处理

可以把mysql脚本导入mysql我数据库。然后再mysqldump只导出数据到csv等。然后再导入文件进SqlServer

Oracle、SQLServer 删除表中的重复数据,只保留一条记录

Oracle、SQLServer 删除表中的重复数据,只保留一条记录

原文地址:

https://blog.csdn.net/yangwenxue_admin/article/details/51742426

https://www.cnblogs.com/springsnow/p/10334469.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

****************Oracle 删除表中的重复数据****************

一、重复记录根据单个字段来判断

1、首先,查找表中多余的重复记录,重复记录是根据单个字段(FIELD_CODE)来判断

select * from R_RESOURCE_DETAILS where FIELD_CODE in
(select FIELD_CODE from R_RESOURCE_DETAILS group by FIELD_CODE having count(FIELD_CODE) >1)

2、删除表中多余的重复记录,重复记录是根据单个字段(FIELD_CODE)来判断,只留有rowid最小的记录

delete from R_RESOURCE_DETAILS where (FIELD_CODE) in 
(select FIELD_CODE from R_RESOURCE_DETAILS group by FIELD_CODE having count(FIELD_CODE) >1) 
and rowid not in (select min(rowid) from R_RESOURCE_DETAILS group by FIELD_CODE having count(*)>1)

二、重复记录根据多个字段来判断

1、查找表中多余的重复记录(多个字段)

select * from R_RESOURCE_DETAILS a where (a.FIELD_CODE,a.DTA_ITEM_NAME) in
(select FIELD_CODE,DTA_ITEM_NAME from R_RESOURCE_DETAILS group by FIELD_CODE,DTA_ITEM_NAME having count(*) > 1)

2、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from R_RESOURCE_DETAILS a where (a.FIELD_CODE,a.DTA_ITEM_NAME) in 
(select FIELD_CODE,DTA_ITEM_NAME from R_RESOURCE_DETAILS group by FIELD_CODE,DTA_ITEM_NAME having count(*) > 1) 
and 
rowid not in (select min(rowid) from R_RESOURCE_DETAILS group by FIELD_CODE,DTA_ITEM_NAME having count(*)>1)

3、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select * from R_RESOURCE_DETAILS a 
where (a.FIELD_CODE,a.DTA_ITEM_NAME) in 
(select FIELD_CODE,DTA_ITEM_NAME from R_RESOURCE_DETAILS group by FIELD_CODE,DTA_ITEM_NAME having count(*) > 1) 
and 
rowid not in (select min(rowid) from R_RESOURCE_DETAILS group by FIELD_CODE,DTA_ITEM_NAME having count(*)>1)

****************SQLServer 删除表中的重复数据****************

1、查询表中Name 重复的数据
2、有唯一列,通过唯一列最大或最小方式删除重复记录
3、无唯一列使用ROW_NUMBER()函数删除重复记录

1、查询表中Name 重复的数据

select Name from Student group by  Name having count(Name) > 1

2、有唯一列,通过唯一列最大或最小方式删除重复记录

检查表中是否有主键或者唯一值的列,当前可以数据看到ID是唯一的,可以通过Name分组排除掉ID最大或最小的行

delete from Student
  where Name in( select Name from Student group by  Name having count(Name) > 1) and 
 ID not in(select  max(ID) from Student group by  Name having count(Name) > 1 )

执行删除脚本后查询

3、无唯一列使用ROW_NUMBER()函数删除重复记录

如果表中没有唯一值的列,可以通过 来删除重复数据 
重复执行插入脚本,查看表数据,表中没有唯一列值

Delete T From
 (Select Row_Number() Over(Partition By [Name] order By [ID]) As RowNumber,* From Student)T
 Where T.RowNumber > 1

小知识点

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
         表示根据COLUMN分组,在分组内部根据 COLUMN排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
         函数“Row_Number”必须有 OVER 子句。OVER 子句必须有包含 ORDER BY
         Row_Number() Over(Partition By [Name] order By [ID])  表示已name列分组,在每组内以ID列进行升序排序,每组内返回一个唯一的序号

执行删除脚本后查询表数据

 

关于sqlserver sql 对重复数据的操作 查找 删除sql查询删除重复的数据的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于MS SQLSERVER删除重复数据且只保留一条、MySql SqlServer 根据id删除表中数据的最优方案、mysql-MySQL数据库能转换成SQLServer吗?我有一个MySQL的脚本文件怎么才能在SQLServer里操作、Oracle、SQLServer 删除表中的重复数据,只保留一条记录的相关信息,请在本站寻找。

本文标签: