Requires Free Membership to View
Yes, you can, but maybe not in a single query. The exact SQL required depends largely on which of the duplicate rows you want to keep, and partly on which database system you're using (because of minor differences in SQL syntax).
My condolences to you. "Accidentally got dropped" is not as funny as it sounds, right?
This "duplicates" question comes up all the time, and the answer is never simple. "Duplicates" is in quotes because there are typically never any true duplicate rows, just duplicate keys which aren't actual keys, such as when a PRIMARY KEY or UNIQUE constraint is accidentally dropped, or never declared in the first place.
Without knowing what other columns are in the table along with empid and deptid, it's difficult to suggest a strategy for which of the "duplicate" rows you want to keep. For example, suppose your table looks like this:
empid deptid salary 21 101 32000 21 101 28000 21 123 35000 37 555 27600 45 200 43000 45 200 47000
In the above example, how do you decide which row to keep? Would you just average the salary for each employee? Take the lowest salary? The highest?
On the other hand, if there really is no other column in the table along with empid and deptid, then there are true duplicate rows, so the following SELECT DISTINCT strategy will work:
select distinct empid, deptid into newtable from maintable
delete from maintable
insert into maintable select empid, deptid from newtable
alter table maintable add constraint mypkey primary key (empid, deptid)
As always, when running any SQL that changes data, it's a good idea to take a backup first.
This was first published in February 2005