2011-06-15 23 views
5

Ciao ho nome della tabella FriendsData che contiene i record duplicati, come illustrato di seguitoCome eliminare tutti i record duplicati dalla tabella SQL?

fID UserID FriendsID  IsSpecial  CreatedBy 
----------------------------------------------------------------- 
1 10   11   FALSE   1 
2 11   5   FALSE   1 
3 10   11   FALSE   1 
4 5   25   FALSE   1 
5 10   11   FALSE   1 
6 12   11   FALSE   1 
7 11   5   FALSE   1 
8 10   11   FALSE   1 
9 12   11   FALSE   1 

Voglio rimuovere combinazioni duplicate file utilizzando MS SQL?
Elimina i record duplicati più recenti dalla tabella MS SQL FriendsData. qui ho allegato l'immagine che evidenzia le combinazioni di colonne duplicate.

enter image description here

Come posso rimosso tutte le combinazioni duplicati dalla tabella SQL?

risposta

9

Prova questa

DELETE 
FROM FriendsData 
WHERE fID NOT IN 
(
SELECT MIN(fID) 
FROM FriendsData 
GROUP BY UserID, FriendsID) 

Vedi here

O here è più modi di fare ciò che si vuole

Spero che questo aiuti

+0

Grazie @ArsenMkrt –

+0

Siete i benvenuti @Abhishek –

+1

@Abhishek: questo lascia il duplicato più recente, non "rimuove l'ultimo duplicato" che avete indicato nella domanda. –

1

Non so se la sintassi è corretta per MS-SQL, ma in MySQL, la query sarà simile a:

DELETE FROM FriendsData WHERE fID 
     NOT IN (SELECT fID FROM FriendsData 
        GROUP BY UserID, FriendsUserID, IsSpecial, CreatedBy) 

Nella clausola GROUP BY si mette le colonne è necessario essere identico al fine di prendere in considerazione due record duplicati

+0

Grazie a @Constantin per una buona risposta. –

+0

siete i benvenuti - un upvote è molto apprezzato: D –

+0

fID non è contenuto in una funzione aggregata o in una clausola group by. La suddetta istruzione sql funzionerà così com'è? – shashi

0

Prova questa ricerca,

select * from FriendsData f1, FriendsData f2 
    Where f1.fID=f2.fID and f1.UserID =f2.UserID and f1.FriendsID =f2.FriendsID 

Se le righe duplicate ritorna, quindi sostituire Select * da "elimina"

che risolverà il vostro problema

+0

Ma non cancellerà * tutte * le righe nel set duplicato? Penso che l'esigenza sia di lasciarne uno indietro. –

3

sembra contro-intuitivo, ma è possibile eliminare da una scheda comune espressione (in determinate circostanze). Così, lo farei in questo modo:

with cte as (
    select *, 
    row_number() over (partition by userid, friendsid order by fid) as [rn] 
    from FriendsData 
) 
delete cte where [rn] <> 1 

Ciò manterrà il record con il fid più basso. Se desideri qualcos'altro, modifica la clausola order by nella clausola over.

Se è un'opzione, inserire un vincolo di unicità sul tavolo in modo da non dover continuare a farlo. Non aiuta a salvare una barca se hai ancora una perdita!

+1

Grazie per la buona risposta .. interrogazione mancanti dalla parola chiave ... "con CTE come ( select *, row_number() su (partizione userid, ordine friendsid dal FID) come [RN] FROM FriendsData ) eliminare cte dove [rn] <> 1 "Ho ragione? –

+0

Ah si ... Ho perso la clausola FROM nel CTE. Perdonami per quello; post originale modificato. –

Problemi correlati