-1

I hava a table emp, I wish to delete the duplicate values. The subquery is good.

SELECT ename 
                 FROM   emp 
                 GROUP  BY ename 
                 HAVING Count(empno) > 1

But when I do the delete operation its deleting all the lines. I don't understand what mistake I'm doing.

DELETE FROM emp 
WHERE  ename IN (SELECT ename 
                 FROM   emp 
                 GROUP  BY ename 
                 HAVING Count(empno) > 1); 
Andy K
  • 4,944
  • 10
  • 53
  • 82

1 Answers1

3

It deletes all ENAMEs, not only duplicates (i.e. it doesn't leave one row). Try something like

Table contents at beginning:

SQL> select * From temp order by id;

        ID ENAME
---------- ----------
         1 Little
         2 Little          --> duplicate ENAME
         3 Foot

Deleting:

SQL> delete from temp a
  2  where a.rowid > (select min(b.rowid)
  3                   from temp b
  4                   where b.ename = a.ename
  5                  );

1 row deleted.

Result;

SQL> select * From temp order by id;

        ID ENAME
---------- ----------
         1 Little
         3 Foot

SQL>
Littlefoot
  • 131,892
  • 15
  • 35
  • 57