Eliminare record doppi in Sql Server

di Stefano Mostarda, in LINQ,

Una delle situazioni più comuni quando si lavora con i database è quella dove si utilizza una chiave surrogata (un identity o un guid) come chiave primaria di una tabella e non si inserisce un indice univoco per la chiave naturale. Per fare un esempio, capita spesso che in una tabella di persone, si usi un campo numerico identity come chiave primaria, e non si metta indice univoco per il codice fiscale. Come risultato, può capitare di avere più record con lo stesso codice fiscale e questo può essere fonte di bug.
Se volessimo sanare questa situazione dovremmo cancellare i record duplicati lasciando un solo record per codice fiscale. Grazie alle window function di Sql Server, eseguire questo genere di query è estremamente semplice: usando la funzione Row_Number in combinazione con Over e Partition By possiamo creare dei gruppi per codice fiscale e dare un numero sequenziale per ogni i record del gruppo dove per ogni gruppo si parte da 1. In questo modo, per ogni gruppo ci basta cancellare i record con numero sequenziale maggiore di 1.

delete q
from
(
  select *,  Pos = row_number() over (partition by CodiceFiscale order by DataInserimento)
  from People
) AS q
WHERE Pos > 1

In questo esempio, raggruppiamo i record per codice fiscale e li ordiniamo per data inserimento all'interno del gruppo. Ad ogni record viene assegnato un campo Pos con la posizione del record all'interno del gruppo. A questo punto vengono cancellati i record con Pos > 1, cioè quelli più recenti.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi