Problema eliminare dati access 2003

giovedì 16 ottobre 2008 - 17.22

jampicoll Profilo | Junior Member

Ciao a tutti.
Cercavo un forum che mi potesse dare un aiuto per quanto riguarda access e credo di averlo trovato...
Allora...veniamo al problema.
Ho una tabella in access con diverse colonne e mi servirebbe fare una cosa particolare...
Vi faccio un po un esempio cosi da capire meglio.

ID-----------Nome--------------Data
5------------Mario--------------01/08/2008
6------------Mario--------------09/09/2008
7------------Luca---------------15/09/2008
8------------Mario--------------16/10/2008

Vorrei realizzare una query che per ogni nome presente in archivio mi mantenga soltanto quello con l'ultima data eliminado i record vecchi.

Spero di essere stato chiaro...

lbenaglia Profilo | Guru

>Cercavo un forum che mi potesse dare un aiuto per quanto riguarda
>access e credo di averlo trovato...

Ciao Giampiero,

Benvenuto sui forum di DNH

>ID-----------Nome--------------Data
>5------------Mario--------------01/08/2008
>6------------Mario--------------09/09/2008
>7------------Luca---------------15/09/2008
>8------------Mario--------------16/10/2008
>
>Vorrei realizzare una query che per ogni nome presente in archivio
>mi mantenga soltanto quello con l'ultima data eliminado i record
>vecchi.

Potresti prima di tutto scrivere un comando di SELECT che esegua una aggregazione per nome, restituendo la massima data per ogni nome:

SELECT Nome, MAX(Data) AS MaxData FROM Nomi GROUP BY Nome;

Ora puoi eseguire una LEFT OUTER JOIN tra la tabella Nomi e la query precedente, utilizzando come colonne di correlazione il Nome e la Data, ottenendo solo le righe non restituite dalla query (clausola Q.Nome IS NULL):

SELECT N.ID FROM Nomi AS N LEFT JOIN ( SELECT Nome, MAX(Data) AS MaxData FROM Nomi GROUP BY Nome ) AS Q ON N.Nome = Q.Nome AND N.Data = Q.MaxData WHERE Q.Nome IS NULL;

Infine non ti resta che eliminare tali righe dalla tabella Nomi:

DELETE FROM Nomi WHERE ID IN ( SELECT N.ID FROM Nomi AS N LEFT JOIN ( SELECT Nome, MAX(Data) AS MaxData FROM Nomi GROUP BY Nome ) AS Q ON N.Nome = Q.Nome AND N.Data = Q.MaxData WHERE Q.Nome IS NULL );

>Spero di essere stato chiaro...
Anch'io

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

jampicoll Profilo | Junior Member

Il problema è che mi restituisce questo errore:
"il modulo di gestione Microsoft jet non è in grado di trovare la tabella o la query di input 'SELECT nome, MAX(data) AS MaxData FROM Tabella1 GROUP BY nome;' Verificare che esista o che il nome sia digitato correttamente.

La cosa strana è che se eseguo soltanto la selezione in questione tutto funziona perfettamente .

Questa è la query che ho inserito automaticamente modificata da ACCEESS e adattata secondo il nome dei campi della mia tabella.

DELETE *
FROM Tabella1
WHERE id IN (
SELECT N.id
FROM Tabella1 AS N LEFT JOIN [SELECT nome, MAX(data) AS MaxData FROM Tabella1 GROUP BY nome; ] AS Q ON (N.nome=Q.nome) AND (N.data=Q.MaxData)
WHERE Q.Nome IS NULL;
);

ASPETTO TUE NOTIZIE

lbenaglia Profilo | Guru

>Le query che hai indicato le devo creare separatamente o tutto
>in un unica query?
La terza query fa tutto il lavoro.
Ti ho semplicemente mostrato come scomporre un problema in n sottoproblemi più facili da risolvere...

>Ti ringrazio anticipatamente.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

jampicoll Profilo | Junior Member

Ormai che ci sono ti chiedo un altra cortesia....

Avendo una tabella con nomi e indirizzi, vorrei eliminare vorrei eliminare tutte le righe "doppie" cioè che hanno stesso nome e stesso indirizzo.

Come faccio???

TI ringrazio
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5