例如: 
  id           name         value 
  1               a                 pp 
  2               a                 pp 
  3               b                 iii 
  4               b                 pp 
  5               b                 pp 
  6               c                 pp 
  7               c                 pp 
  8               c                 iii 
  id是主键 
  要求得到这样的结果 
  id           name         value 
  1               a                 pp 
  3               b                 iii 
  4               b                 pp 
  6               c                 pp 
  8               c                 iii

方法1
delete   YourTable  
  where   [id]   not   in   ( 
  select   max([id])   from   YourTable  
  group   by   (name   +   value)) 
 
方法2
delete   a 
  from   表   a   left   join( 
  select   id=min(id)   from   表   group   by   name,value 
  )b   on   a.id=b.id 
  where   b.id   is   null 
 
 
 
查询及删除重复记录的SQL语句
查询及删除重复记录的SQL语句
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,a.seq) in   (select peopleId,seq from vitae group by 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,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by 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
)

学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。

SQL> desc employee

Name                                      Null?    Type
----------------------------------------- -------- ------------------

emp_id                                                NUMBER(10)
emp_name                                           VARCHAR2(20)

salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:

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                                          20000

SQL> 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);

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

3 xyz                                             30000

2 semon                                         20000

2. 删除的几种方法:

(1)通过建立临时表来实现

SQL>create table temp_emp as (select distinct * from employee)

SQL> truncate table employee; (清空employee表的数据)

SQL> insert into employee select * from temp_emp;  (再将临时表里的内容插回来)

( 2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

SQL>delete from employee e2 where rowid not in (
        select max(e1.rowid) from employee e1 where

        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。

SQL>delete from employee e2 where rowid <(
        select max(e1.rowid) from employee e1 where
        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

e1.salary=e2.salary);

(3)也是通过rowid,但效率更高。

SQL>delete from employee where rowid not in (
        select max(t1.rowid) from employee t1 group by

         t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

3 xyz                                             30000

2 semon                                         20000

SQL> desc employee

Name                                      Null?    Type
----------------------------------------- -------- ------------------

emp_id                                                NUMBER(10)
emp_name                                           VARCHAR2(20)

salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:

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                                          20000

SQL> 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);

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

3 xyz                                             30000

2 semon                                         20000

2. 删除的几种方法:

(1)通过建立临时表来实现

SQL>create table temp_emp as (select distinct * from employee)

SQL> truncate table employee; (清空employee表的数据)

SQL> insert into employee select * from temp_emp;  (再将临时表里的内容插回来)

( 2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

SQL>delete from employee e2 where rowid not in (
        select max(e1.rowid) from employee e1 where

        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。

SQL>delete from employee e2 where rowid <(
        select max(e1.rowid) from employee e1 where
        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

e1.salary=e2.salary);

(3)也是通过rowid,但效率更高。

SQL>delete from employee where rowid not in (
        select max(t1.rowid) from employee t1 group by

         t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

3 xyz                                             30000

2 semon                                         20000

用SQL删除重复记录的N种方法相关推荐

  1. mysql删除重复的判断_MySQL中查询、删除重复记录一共有多少种方法?

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as coun ...

  2. 从Dart列表中删除重复项的2种方法

    本文向您展示了从 Flutter 中的列表中删除重复项的 2 种方法.第一个适用于原始数据类型列表.第二个稍微复杂一些,但适用于map****列表或对象列表. 转换为 Set 然后反转为 List 这 ...

  3. 在Linux中查找和删除重复文件的4种方法

    大神教你在Linux中查找和删除重复文件的4种方法 在本教程中,您将学习如何使用rdfind和fdupes命令行工具以及称为DupeGuru和FSlint的GUI工具在Linux中查找和删除重复文件. ...

  4. sql 删除重复记录保留一条_从零学会SQL·二——简单查询

    一.使用select查询语句完成以下练习 student表 查询姓名和性别 查询所有字段 给查询的字段名替换别名,姓名替换为s_name,性别替换为"人类性别" 查询姓名时删除重复 ...

  5. sql 删除重复记录

    在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢! 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people ...

  6. SQL Server 数据库查找重复记录的几种方法

    http://www.hanyu123.cn/html/c61/6790.html 一.查某一列(或多列)的重复值.(只可以查出重复记录的值,不能查出整个记录的信息) 例如:查找stuid,stuna ...

  7. oracle删除表中数据_Excel工作表中,删除重复数据的2种方法解读,高效且实用!...

    在实际的工作中,经常要对工作表中重复的数据进行删除,如若数据行只有几条,则可通过人工查找出来,如若数据行较多,这种方法就费时费力,而且容易出错,造成对表格数据的准确性和个人能力的怀疑--今天,小编给大 ...

  8. SQL删除重复记录保留最大值

    简介 backends_alertdata 这个表格里面有很多的重复数据,其中每一条重复数据的fingerprint 字段都是一样的,aid 这个是自增字段,是主键.现在需要将这些重复数据删除,但是只 ...

  9. 【mysql 】sql删除重复记录 You can't specify target table '表名' for update in FROM clause

    用下面的语句就报语法出错: delete from tab_record where recordid not in (select  min(c.recordid) as recordid from ...

最新文章

  1. 宝塔mysql优化_宝塔面板下实现MySQL性能优化处理
  2. SSH登陆慢的原因分析及解决
  3. 【任务脚本】0601更新autojs客户端,回顾之前战绩,注意事项淘宝618活动领喵币autojs脚本,向大神致敬...
  4. 有关调试CRM系统的一些感想
  5. 使用WebClient 获得网页内容或提交请求
  6. LeetCode 21 合并两个有序链表
  7. webRTC实战总结
  8. Unity自带网络功能——NetworkView组件、Serialize、RPC
  9. python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...
  10. 95后人才吸引力城市排名发布,深圳位居全国第二
  11. NachOS简述和源文件
  12. python wlsxwriter_python xlsxwriter模块的使用
  13. JavaScript中this的绑定
  14. 格林酒店2020年第三季度营收为2.67亿元,恢复至同期91.4%
  15. TM Forum的TAM中文架构图
  16. 如何将局域网IP映射为公网IP
  17. Resources的使用方式
  18. Java使用AES/EBC/PKCS5Padding加密,CryptoJS解密错误
  19. 项目管理领域关键知识点之横道图和网络图
  20. 收编娘内幕整合版(高质量PDF版)

热门文章

  1. Python 阅读书目推荐
  2. 深度学习Deep Learning: dropout策略防止过拟合
  3. 程序员笔试面试基础知识资料整理
  4. Java.io包中常用的类
  5. 【模板】最小割树(Gomory-Hu Tree)
  6. 【 Thread】创建线程的2种方法
  7. laravel模型中设计使用单选按钮的方法:
  8. Replica Sets+Sharding方案之真枪实弹篇
  9. eclipse format的时候如何让@param后不换行
  10. 警告:failed to load the sqljdbc_auth.dll cause no sqljdbc_auth in java.library.path