删除反复行SQL实验简单举例

说明:实验按顺序进行。前后存在关联性。阅读时请注意。打开文件夹更便于查看。

构造实验环境:





SQL> select count(*) from emp;

  COUNT(*)

----------

        14

SQL> alter table EMP drop constraint PK_EMP CASCADE;

--删除主键约束

SQL> insert into EMP select * from EMP;

--向EMP表中插入反复行

SQL> commit;

SQL> select count(*) from emp;

  COUNT(*)

----------

        28

        

以下举例单字段删除反复行

例1:查询出反复记录(单字段)

SQL> select * from emp 

where empno in (select empno from emp group by empno having count 

(empno) > 1); 

--查找出emp表中多余的反复记录,反复记录是依据empno来判读





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30





28 rows selected.

例2:删除表中多余的反复记录,仅仅留有rowid最小的记录

SQL> delete from emp 

where empno in (select empno from emp group by empno having count 

(empno) > 1) 

and rowid not in (select min(rowid) from emp group by empno having count(empno 

)>1); 

--删除表中多余的反复记录。反复记录是依据单个字段empno来判读

--保留rowid最小的行记录信息

14 rows deleted.





SQL> select * from emp ;  --反复的行已经删除





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10





14 rows selected.













SQL> insert into emp select * from emp;





SQL> insert into emp values(8888,'HYL','DBA',7839,sysdate,2000,'',60);





1 row created.





SQL> commit;





Commit complete.





SQL> select * from emp;      





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      8888 HYL        DBA             7839 06-JUL-14       2000                    60





29 rows selected.









多字段下:

例3:查询表中反复的记录(多字段)

SQL> select * from emp a 

where (a.empno,a.deptno) in (select empno,deptno from emp group by empno,deptno having 

count(*) > 1); 





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30





28 rows selected.

例4:删除表中反复记录(多个字段),仅仅保留rowid最小的记录

SQL> delete from emp a 

where (a.empno,a.deptno) in (select empno,deptno from emp group by empno,deptno having 

count(*) > 1) 

and rowid not in (select min(rowid) from emp group by empno,deptno having count(*)>1); 





14 rows deleted.





SQL> select * from emp;





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      8888 HYL        DBA             7839 06-JUL-14       2000                    60





15 rows selected.













SQL> rollback 

  2  ;





Rollback complete.





SQL> select * from emp;





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      8888 HYL        DBA             7839 06-JUL-14       2000                    60





29 rows selected.

例5:查询表中多余的反复记录(多字段)。不包括rowid最小的记录

SQL> select * from emp a 

where (a.empno,a.deptno) in (select empno,deptno from emp group by empno,deptno having 

count(*) > 1) 

and rowid not in (select min(rowid) from emp group by empno,deptno having count(*)>1);





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30





14 rows selected.





SQL> commit;





Commit complete.





SQL> select * from emp;   --emp表实际数据





     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      8888 HYL        DBA             7839 06-JUL-14       2000                    60





29 rows selected.

***********************************************声明************************************************

原创作品,出自 “深蓝的blog” 博客。欢迎转载。转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。

表述有错误之处。请您留言。不胜感激。

提醒:点击文件夹。更有助于您的查看。

*****************************************************************************************************

删除反复行SQL举例的更多相关文章

  1. SQL Server删除重复行的6个方法

    SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect   ta ...

  2. SQL查找删除重复行

    本文讲述如何查找数据库里重复的行.这是初学者十分普遍遇到的问题.方法也很简单.这个问题还可以有其他演变,例如,如何查找“两字段重复的行”(#mysql IRC 频道问到的问题) 如何查找重复行 第一步 ...

  3. 【sql server】"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 解决方案

    #事故现场: 1.在手动修改某表中数据是,出现如下错误提示:  已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 2.表结构及数据: #解决方法: 1.原因分析:提示被删除的行不是唯一行, ...

  4. PreparedStatement執行sql語句

    import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org ...

  5. Oracle删除重复行

    Oracle删除重复行 分类: ORACLE2010-12-12 17:10 423人阅读 评论(0) 收藏 举报 oracletabledeleteintegerinsert.net 查询及删除重复 ...

  6. SqlServer_删除重复行只保留一条记录

      前提:相同的数据重复往数据库写入,导致存在仅主键Id不同的重复数据,现在需要去除重复数据,仅保留重复数据中Id最大的一条   思路: 1.找出存在重复数据的记录,并取重复数据中最大的Id值 2.删 ...

  7. Linux之sed:删除某行以及替换

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed ...

  8. REDHAT一总复习1 vim编辑器的使用 删除所有者列 删除指定行

    将文件/home/student/vimfile.txt 复制到server 上的/home/student/longlisting.txt . 根据下列要求,使用vim编辑器更改 /home/stu ...

  9. jquery Datatables 行数据删除、行上升、行下降功能演示

    Datatables 是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官方网站:http://www.datatables.net Datatables ...

随机推荐

  1. 批量保存 htm

    公司项目,需要对一个列表做批量保存到Doc的功能. 后来通过架构人员协助,采用MemoryStream二进制流的方式保存为htm文档. 然后通过第3方的dll,ICSharpCode.SharpZip ...

  2. CSDN数据库下载地址 CSDN 用户名密码泄漏,600万数据下载

    原文发布时间为:2011-12-21 -- 来源于本人的百度文章 [由搬家工具导入] 12月21日消息,下午有网友爆料称国内最大的开发者社区CSDN.NET的安全系统遭到黑客攻击,CSDN数据库中的6 ...

  3. EasyUI左边树菜单和datagrid分页

    //这个页面是Home.html 1 <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...

  4. java获取整数的各位数值

    第一种是取模运算 int qian =input/1000; //千位除以1000 int bai = input/100%10;//百位除以100%10 int shi = input%100/10 ...

  5. HDU 6229 Wandering Robots(2017 沈阳区域赛 M题,结论)

    题目链接  HDU 6229 题意 在一个$N * N$的格子矩阵里,有一个机器人. 格子按照行和列标号,左上角的坐标为$(0, 0)$,右下角的坐标为$(N - 1, N - 1)$ 有一个机器人, ...

  6. spring-cloud集成mybatis-plus

    mybatis-plus插件是对mybatis做出系列增强插件,后面简称MP,MP可免去开发者重复编写xml.mapper.service.entity等代码,通过MP提供的实体注解来完成单表的CRU ...

  7. golang实现dns域名解析(二)

    上一节已经讲了如何构造dns请求包的情况,这一节接着上一节的情况,谈谈dns查询报文中的问题部分.问题部分中每个问题的格式如下: 查询名是要查找的名字,它是一个或者多个标识符的序列.每个标识符以首字母 ...

  8. PostgreSQL 10.0 preview 功能增强

    https://yq.aliyun.com/users/1384833841157402?spm=5176.100239.blogrightarea51131.3.yI7e9d

  9. 《Microsoft SQL Server 2008 Internals》读书笔记--目录索引

    http://blog.csdn.net/downmoon/article/details/5256548 https://sqlserverinternals.com/companion/

  10. webservice测试窗体只能用于来自本地计算机的请求

    写在前面 在编写好webservice后,发布到iis服务器,你会发现会有这样的异常“测试窗体只能用于来自本地计算机的请求”. 解决方案 在web.config中添加以下代码即可解决问题 <we ...