删除反复行SQL举例

删除反复行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)。

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

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

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

时间: 2024-10-22 04:31:20

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

删除重复行SQL举例

删除重复行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 Server删除重复行的6个方法

SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect   table  tableName  where   id   not   in   (   select   max(id)   from   table   group   by   col1,col2,col3...   )    group   by   子句后跟的字段就是你用来判断重复的条件,如

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 (selec

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

#事故现场: 1.在手动修改某表中数据是,出现如下错误提示:  已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 2.表结构及数据: #解决方法: 1.原因分析:提示被删除的行不是唯一行,检查发现: 表中出现了重复的数据({name:小红,age:10}),所以当视图删除时,会提示错误: 2.解决方法一:添加中间,使行值成为唯一值: sql语句: ALTER TABLE UserInfo add ID int identity primary key 效果: 3.解决方法二:先将原用

已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行

在对一个表做试验的时候,往里面添加了几条数据,后来发现原本想作为主键的字段的值都为"NULL",这可不行,删除重新来吧.选中删除的时候就出现了 "已更改或删除的行值要么不能使改行成为唯一行,要么改变了多个行(X行)"的错误. 原来是建表的时候忘了添加主键,但是现在删除也删除不了,往里面填东西吧,也填不了,也报错.没有办法啊~百度吧~各种解决办法,终于找到了我这个菜鸟能看懂而且操作出来的方法.(好方法!!!) 解决方法: 单击SQL工具栏上的"新建查询&qu

删除反复字符

删除反复字符 给定一个字符串,将字符串中全部和前面反复多余的字符删除.其余字符保留,输出处理后的字符串. 须要保证字符出现的先后顺序,而且区分大写和小写. 具体描写叙述: 接口说明 原型: int GetResult(const char *input, char *output) 输入參数: input     输入的字符串 输出參数(需考虑指针指向的内存区域是否有效): output    输出的字符串 返回值: 0         成功 -1        失败及异常 举例: 输入: ab

Oracle删除重复行

Oracle删除重复行 分类: ORACLE2010-12-12 17:10 423人阅读 评论(0) 收藏 举报 oracletabledeleteintegerinsert.net 查询及删除重复记录的SQL语句1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from   people group by   peopleId having count(

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

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed [-nefri] 'command' 输入文本 常用选项:        -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来.        -e∶直接在

PreparedStatement執行sql語句

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; import util.JdbcUtil; /** * PreparedStatement執行sql語句 * @author APPle * */ public class Demo1 { /** * 增加 */ @Test public void testInsert()