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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare @property per animare nativamente un oggetto HTML tramite CSS
Utilizzare zizmor per rendere più sicuri i workflow di GitHub
Eseguire una ExecuteUpdateAsync senza usare un'expression con Entity Framework
Azure SQL Database per dev: tutte le novità da non perdere
Ciclo di vita risorse con .NET Aspire
Testare le API di Azure Resource Manager con API Playground
Stop alle password con Azure Managed Identity
Ottimizzare i costi con Smart tier in Azure Blob Storage
Supporto semplificato per le left join in Entity Framework 10
GitHub Copilot CLI in ambienti offline
Escludere alcuni file da GitHub Copilot
Utilizzare il top layer in HTML
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Utilizzare un DataContext specifico per la modalità design time di Blend e Visual Studio nei controlli Silverlight
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Le DirectInk API nella Universal Windows Platform
- Gli oggetti CallOut di Expression Blend 4.0
- Esaminare documenti con namespace con LINQ e XDocument
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE


