How to Delete Duplicate Records in SQL – Oracle
Duplicate records indicate that the current record is exactly copy of another record.
Creating setup for duplicate records:
CREATE TABLE EMP_DUP AS SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, DEPARTMENT_ID FROM EMPLOYEES WHERE 1 = 2;
DESC EMP_DUP;
Removing not null constraint for allowing duplicate records to be inserted into EMP_DUP table.
ALTER TABLE EMP_DUP MODIFY(LAST_NAME NULL); ALTER TABLE EMP_DUP MODIFY(JOB_ID NULL);
DESC EMP_DUP;
Inserting duplicate records into EMP_DUP table:
--How to Delete Duplicate Records in SQL - Oracle: Example BEGIN FOR I IN 1..2 LOOP INSERT INTO EMP_DUP SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, DEPARTMENT_ID FROM EMPLOYEES WHERE DEPARTMENT_ID = 30; END LOOP; END; / COMMIT;
SELECT * FROM EMP_DUP ORDER BY EMPLOYEE_ID;
How would you see duplicate records from a table?
--How to Delete Duplicate Records in SQL - Oracle: Example SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, DEPARTMENT_ID, COUNT(1) COUNT FROM EMP_DUP GROUP BY EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, DEPARTMENT_ID HAVING COUNT(1) > 1;
Finding duplicate records via Analytical Function:
--How to Delete Duplicate Records in SQL - Oracle: Example: Through Analytical function SELECT * FROM(SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, DEPARTMENT_ID, COUNT(1) OVER(PARTITION BY EMPLOYEE_ID ORDER BY EMPLOYEE_ID) COUNT FROM EMP_DUP) WHERE COUNT > 1;
Using WITH clause:
----How to Delete Duplicate Records in SQL - Oracle: Example: WITH Clause WITH DUP_DATA AS (SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, DEPARTMENT_ID, COUNT(1) OVER(PARTITION BY EMPLOYEE_ID ORDER BY EMPLOYEE_ID) COUNT FROM EMP_DUP) SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, DEPARTMENT_ID, COUNT FROM DUP_DATA WHERE COUNT > 1;
How do you remove duplicate records in SQL?:
There are multiple ways to delete duplicated records.
Removing Duplicate records from EMP_DUP table keeping the initial version:
- If no of records are handful then we can manually delete the records.
- If no of records are high then we can use ROWID with MIN and MAX function depending on which records we want to keep in database
- If we want to keep the initial records then we can use the MAX function
- If we want to keep the last records then we can use MAX function
DELETE EMP_DUP A WHERE A.ROWID < (SELECT MAX(B.ROWID) FROM EMP_DUP B WHERE B.EMPLOYEE_ID = A.EMPLOYEE_ID);
SELECT * FROM EMP_DUP ORDER BY EMPLOYEE_ID;
ROLLBACK;
Removing Duplicate records from EMP_DUP table keeping the latest version:
DELETE EMP_DUP A WHERE A.ROWID > (SELECT MIN(B.ROWID) FROM EMP_DUP B WHERE B.EMPLOYEE_ID = A.EMPLOYEE_ID);
SELECT * FROM EMP_DUP ORDER BY EMPLOYEE_ID;
ROLLBACK;
Correlated Delete:
If you want to delete the duplicate rows based on a list of column group then you can use the Corelated Delete.
Change in existing setup for Corelated Delete:
--https://asktom.oracle.com/pls/apex/f?p=100:11:::::P11_QUESTION_ID:1224636375004 ALTER TABLE EMP_DUP ADD(BUSINESS_DATE DATE); BEGIN FOR I IN (SELECT ROWID, A.* FROM EMP_DUP A ORDER BY ROWID FETCH FIRST 6 ROWS ONLY) LOOP UPDATE EMP_DUP SET BUSINESS_DATE = SYSDATE WHERE ROWID = I.ROWID; END LOOP; -- FOR I IN (SELECT ROWID, A.* FROM EMP_DUP A ORDER BY ROWID OFFSET 6 ROWS FETCH NEXT 6 ROWS ONLY) LOOP UPDATE EMP_DUP SET BUSINESS_DATE = SYSDATE - 1 WHERE ROWID = I.ROWID; END LOOP; END; / COMMIT;
SELECT * FROM EMP_DUP ORDER BY BUSINESS_DATE;
DELETE EMP_DUP A WHERE A.BUSINESS_DATE NOT IN (SELECT MIN(B.BUSINESS_DATE) FROM EMP_DUP B WHERE B.EMPLOYEE_ID = A.EMPLOYEE_ID AND B.LAST_NAME = A.LAST_NAME AND B.JOB_ID = A.JOB_ID);
Un-Correlated Delete:
If you want to delete records based on unique column then we should use Un-Correlated Delete.
INSERT INTO EMP_DUP(EMPLOYEE_ID, BUSINESS_DATE) SELECT EMPLOYEE_ID, SYSDATE + 1 FROM EMPLOYEES WHERE DEPARTMENT_ID = 30;
SELECT * FROM EMP_DUP ORDER BY EMPLOYEE_ID;
DELETE EMP_DUP WHERE BUSINESS_DATE NOT IN (SELECT MIN(BUSINESS_DATE) FROM EMP_DUP GROUP BY EMPLOYEE_ID);
SELECT * FROM EMP_DUP ORDER BY EMPLOYEE_ID;
RELATED TOPICS: