This script can be used to delete duplicate rows from tables. Especially useful if you are migrating data from other sources into an Oracle database and you have to delete repeated data so as to ensure your data is unique as per your new Primary Key contraints which you want to impose on your table.
This script uses the EMP table in the SCOTT schema as an example. To view duplicate rows in your table, use the Script to find duplicate rows . Also, note that I find (and hence delete) the duplicate rows using the empno field, since that is the primay key for the EMP table. For your purposes, you will have to replace the empno reference with your potential primary key field(s).
Back to SQL scripts
| SQL> | DELETE | emp e1 |
| | WHERE | rowid > (SELECT min(rowid) |
| | | FROM emp e2 |
| | | WHERE e.empno = e2.empno) |
To run the code, either cut and paste it onto your favourite editor and save the file to say deleteDuplicates.sql. .
At the SQL*PLUS prompt, execute the script using the syntax
SQL>@deleteDuplicates
On execution, the script delete duplicate rows from the table. Please note that for every row that has been duplicated, only one row remains in the table and all other duplicates are deleted.
Consider the following example using the EMP table:
| SQL> | SELECT *
|
| 2 | FROM emp;
|
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
--------- | ---------- | --------- | --------- | --------- | --------- | --------- | --------- |
| 7369 | SMITH | CLERK | 7902 | 17-DEC-80 | 800 | | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 20-FEB-81 | 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 22-FEB-81 | 1250 | 500 | 30 |
|
7566 | JONES | MANAGER | 7839 | 02-APR-81 | 2975 | | 20 |
|
7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 | 1250 | 1400 | 30 |
|
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 | 2850 | | 30 |
|
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 | 2450 | | 20 |
|
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 | 3000 | | 10 |
|
7839 | KING | PRESIDENT | | 17-NOV-81 | 5000 | | 10 |
|
7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 | 1500 | 0 | 30 |
|
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 | 1100 | | 20 |
|
7900 | JAMES | CLERK | 7698 | 03-DEC-81 | 950 | | 30 |
|
7902 | FORD | ANALYST | 7566 | 03-DEC-81 | 3000 | | 20 |
|
7934 | MILLER | CLERK | 7782 | 23-JAN-82 | 1300 | | 10 |
|
7369 | SMITH | CLERK | 7902 | 17-DEC-80 | 800 | | 20 |
|
7566 | JONES | MANAGER | 7839 | 02-APR-81 | 2975 | | 20 |
|
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 | 2850 | | 30 |
|
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 | 2450 | | 20 |
|
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 | 3000 | | 10 |
|
7839 | KING | PRESIDENT | | 17-NOV-81 | 5000 | | 10 |
|
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 | 1100 | | 20 |
|
7900 | JAMES | CLERK | 7698 | 03-DEC-81 | 950 | | 30 |
|
7902 | FORD | ANALYST | 7566 | 03-DEC-81 | 3000 | | 20 |
|
7934 | MILLER | CLERK | 7782 | 23-JAN-82 | 1300 | | 10 |
24 rows selected.
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
| --------- | ---------- | --------- | --------- | --------- | --------- | --------- | --------- |
|
7369 | SMITH | CLERK | 7902 | 17-DEC-80 | 800 | | 20 |
|
7369 | SMITH | CLERK | 7902 | 17-DEC-80 | 800 | | 20 |
|
7566 | JONES | MANAGER | 7839 | 02-APR-81 | 2975 | | 20 |
|
7566 | JONES | MANAGER | 7839 | 02-APR-81 | 2975 | | 20 |
|
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 | 2850 | | 30 |
|
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 | 2850 | | 30 |
|
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 | 2450 | | 20 |
|
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 | 2450 | | 20 |
|
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 | 3000 | | 10 |
|
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 | 3000 | | 10 |
|
7839 | KING | PRESIDENT | | 17-NOV-81 | 5000 | | 10 |
|
7839 | KING | PRESIDENT | | 17-NOV-81 | 5000 | | 10 |
|
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 | 1100 | | 20 |
|
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 | 1100 | | 20 |
|
7900 | JAMES | CLERK | 7698 | 03-DEC-81 | 950 | | 30 |
|
7900 | JAMES | CLERK | 7698 | 03-DEC-81 | 950 | | 30 |
|
7902 | FORD | ANALYST | 7566 | 03-DEC-81 | 3000 | | 20 |
|
7902 | FORD | ANALYST | 7566 | 03-DEC-81 | 3000 | | 20 |
|
7934 | MILLER | CLERK | 7782 | 23-JAN-82 | 1300 | | 10 |
|
7934 | MILLER | CLERK | 7782 | 23-JAN-82 | 1300 | | 10 |
20 rows selected.
10 rows deleted.
no rows selected
SQL>
SQL>
Back to SQL scripts