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
Creare un agente A2Acon Azure Logic Apps
Importare un servizio esterno in .NET Aspire
Documentare i servizi REST con Swagger e OpenAPI con .NET 9
Utilizzo di CSS Scroll Snap per realizzare un carousel
Abilitare il rolling update su Azure Functions flex consumption
Centralizzare gli endpoint AI Foundry con Azure API Management
Integrare OpenAI tramite Aspire
Gestione file Javascript in Blazor con .NET 9
Esporre un server MCP esistente con Azure API Management
Utilizzare Intersect e Except per filtrare set di dati in TSql
Abilitare automaticamente il force push di un gruppo su Azure DevOps
Disabilitare le run concorrenti di una pipeline di Azure DevOps


