Tre metodi possibili che mi vengono in mente.
1) Implementi una Delete dove inserisci nella condizione Where la Select che ti legge i record doppioni ma non il primo di questi, oppure il contrario.
2) Non applicabile (non credo, ma non sono sicuro) se l'id è referenziato da campi di altre tabelle e se è autoincrementale.
Metti in una tabella temporanea (#tmp_univoci:
http://databases.aspfaq.com/database/should-i-use-a-temp-table-or-a-table-variable.html) i record univoci ottenuti da una select ad-hoc.
Vuoti la tabella iniziale (comando Drop o Truncate o Delete).
Riempi la tabella con i record della tabella temporanea.
3) Una terza via (e forse la più diretta-corretta) potrebbe essere quella di scorrere con un cursore (CURSOR) la tabella originale.
Inseriendo in una tabella temporanea gli id dei record univoci, ovvero SE questo id non vi è già stato aggiunto.
Quindi, si può procedere alla cancellazione dei record corrispondenti ad id NON presenti (tranne quelli aggiunti dopo l'inizio dell'operazione, magari tenendo memorizzato in una variabile il massimo id presente in tabella finora).
Purtroppo non ho il tempo di provare, ma io sarei partito da queste idee per "pulire" la tabella dai nominativi doppione.
Non so se puoi usare stored procedure ne se le tabelle locali e/o globali sono possibili direttamente nelle query, ne tantomeno i cursori, quindi ti posto un esempio funzionante in una query, anche se mi sembra "mostruosa" per il semplice compito che ha.
Infatti ero partito per ottenere tutti i record univoci.
Forse puoi semplificare il Delete per usare un unica query interna senza usare "UNION" e usando "IN" invece di not IN.
La Delete che usa una query per ottenere i record evitando quelli considerati doppioni può essere, sarebbe il "contrario" del caso 1):
Delete From Test_1 Where id not IN (
select Univoci.id from (
-- record non duplicati
select TA.id, TA.nome, TA.cognome /* T1.*, TA.count */
From Test_1 TA
inner join (
select nome, cognome, COUNT(id) as count
From Test_1
group by nome, cognome
having COUNT(id) = 1 -- no doppioni
) as T1 on T1.nome = TA.nome and T1.cognome = TA.cognome
UNION
-- solo primo record (id minore) dei duplicati
Select T3.id, TA.nome, TA.cognome
From Test_1 TA
inner join (
select Min(id) as id
From Test_1 Tid
join (
select T4.nome, T4.cognome, COUNT(T4.id) as count
From Test_1 T4
group by T4.nome, T4.cognome
having COUNT(T4.id) > 1 -- con doppioni
) as TD on TD.nome = Tid.nome and TD.cognome = Tid.cognome
group by Tid.nome, Tid.cognome
) as T3 on T3.id = TA.id
) as Univoci
)
Ciao
Alessandro