piuttosto tardi, ma soluzione più semplice potrebbe essere la seguente supponiamo di avere tavolo emp_dept (EmpID, deptid), che ha le righe duplicate, Qui ho usato come @Count varibale .. per esempio 2 duplicato permesso poi @count = 2 Sul database Oracle
delete from emp_dept where @Count <= (select count(1) from emp_dept i where i.empid = emp_dept.empid and i.deptid = emp_dept.deptid and i.rowid < emp_dept.rowid)
On SQL Server o anydatabase che non supporta fila id dispongono po ', abbiamo bisogno di aggiungere colonna di identità solo per identificare ogni riga. dicono abbiamo aggiunto nid come identità al tavolo
alter table emp_dept add nid int identity(1,1) -- to add identity column
ora query per eliminare duplicati potrebbe essere scritto come
delete from emp_dept where @@Count <= (select count(1) from emp_dept i where i.empid = emp_dept.empid and i.deptid = emp_dept.deptid and i.nid< emp_dept.nid)
Qui il concetto è eliminare tutte le righe per le quali esiste altre righe che hanno simili valori fondamentali ma numero n o maggiore di rowid o identità più piccoli. Quindi se esistono righe duplicate, una di esse con ID o ID di riga superiore verrà eliminata. e per la riga non c'è duplicato non riesce a trovare id di riga inferiore quindi non verrà eliminato.
fonte
2013-06-11 06:29:43
quando ci sono 5 i duplicati, volete solo una sinistra dopo la cancellazione, o tre? – Stobor