Discussione:
Eliminazione duplicati in Tabella
(troppo vecchio per rispondere)
Michele Menniti
2010-01-16 19:42:56 UTC
Permalink
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
La struttura è molto semplice:
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Grazie.
--
Michele Menniti
Geppo
2010-01-16 22:44:03 UTC
Permalink
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi
Mario 01/01/1980, uno deve restare e l'altro deve essere eliminato.
potresti usare il predicato DISTINCT per creare una nuova tabella senza
duplicati:

select distinct TuaTabella.Cognome, TuaTAbella.nome,TuaTabella.datadinascita
into NuovaTabella
from TuaTabella
Post by Michele Menniti
Grazie.
--
Ciao
Geppo
Michele Menniti
2010-01-17 09:35:09 UTC
Permalink
Post by Geppo
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi
Mario 01/01/1980, uno deve restare e l'altro deve essere eliminato.
potresti usare il predicato DISTINCT per creare una nuova tabella senza
select distinct TuaTabella.Cognome,
TuaTAbella.nome,TuaTabella.datadinascita
into NuovaTabella
from TuaTabella
Post by Michele Menniti
Grazie.
--
Ciao
Geppo
Perfetto Geppo, ho risolto all'istante col tuo suggerimento!
Grazie.
--
Michele Menniti
Vladimiro Leone
2010-01-16 23:27:47 UTC
Permalink
On 16 Gen, 20:42, "Michele Menniti"
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Grazie.
--
Michele Menniti
Ciao Michele, se ti fa comodo, con una query puoi verificare tutti i
duplicati esistenti e magari cancellarli nella query stessa, badando
naturalmente a non cancellare quello "originale".

SELECT *
FROM tabella1
WHERE (((Exists (SELECT Cognome,Nome,DataDiNascita
FROM tabella1 As Tmp
WHERE Tmp.Cognome=tabella1.Cognome
AND Tmp.Nome=tabella1.Nome
AND Tmp.DataDiNascita=tabella1.DataDiNascita
GROUP BY Cognome,Nome,DataDiNascita
HAVING Count(*)>1 ))<>False))
ORDER BY tabella1.Cognome;

Cambia il nome Tabella1 con il vero nome della tua tabella.
Ciao Vladimiro.
Michele Menniti
2010-01-17 09:54:56 UTC
Permalink
"Vladimiro Leone" <***@alice.it> ha scritto nel messaggio news:d174cfe0-e77c-4099-8c2a-***@30g2000yqu.googlegroups.com...
On 16 Gen, 20:42, "Michele Menniti"
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Grazie.
--
Michele Menniti
Ciao Michele, se ti fa comodo, con una query puoi verificare tutti i
duplicati esistenti e magari cancellarli nella query stessa, badando
naturalmente a non cancellare quello "originale".

SELECT *
FROM tabella1
WHERE (((Exists (SELECT Cognome,Nome,DataDiNascita
FROM tabella1 As Tmp
WHERE Tmp.Cognome=tabella1.Cognome
AND Tmp.Nome=tabella1.Nome
AND Tmp.DataDiNascita=tabella1.DataDiNascita
GROUP BY Cognome,Nome,DataDiNascita
HAVING Count(*)>1 ))<>False))
ORDER BY tabella1.Cognome;

Cambia il nome Tabella1 con il vero nome della tua tabella.
Ciao Vladimiro.



Ciao Vladimiro,
ho risolto col suggerimento di Geppo, mi è bastato poi eliminare la tabella
originale e rinominare la nuova.
Riguardo al tuo suggerimento, io ero arrivato a numerare progressivamente le
occorrenze, per cui avevo circa 800 record col n°1 e circa 200 col n° 2 ma
non riuscivo ad applicare il comando DELETE all'"esterno" del codice, per
eliminare i soli record col N°2.
Fare l'operazione manualmente è ovviamente possibile ma scomoda e
pericolosa.
Grazie comunque dell'idea, tornerà utile in altre situazioni.
--
Michele Menniti
giorgio rancati
2010-01-17 12:56:26 UTC
Permalink
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Ciao Michele,
Un altro metodo potrebbe essere:
Aggiungi un Id contatore, poi elimina i duplicati con questa query
----
DELETE *
FROM Anagrafica
WHERE Id<>(SELECT Min(Id)
FROM Anagrafica AS A
WHERE A.Nome=Anagrafica.Nome
AND A.Cognome=Anagrafica.Cognome
AND A.DataDiNascita=Anagrafica.DataDiNascita
);
----

Ciao
--
Giorgio Rancati
[Office Access MVP]
Michele Menniti
2010-01-17 17:49:24 UTC
Permalink
Post by Vladimiro Leone
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Ciao Michele,
Aggiungi un Id contatore, poi elimina i duplicati con questa query
----
DELETE *
FROM Anagrafica
WHERE Id<>(SELECT Min(Id)
FROM Anagrafica AS A
WHERE A.Nome=Anagrafica.Nome
AND A.Cognome=Anagrafica.Cognome
AND A.DataDiNascita=Anagrafica.DataDiNascita
);
----
Ciao
--
Giorgio Rancati
[Office Access MVP]
Ciao Giorgio :-)
la tua soluzione è ancora più immediata in quanto opera direttamente sulla
tabella originale, il problema lo avevo risolto ma ho preso buona nota (come
sempre...) per la prossima occasione.
GRAZIE!
Michele
Vladimiro Leone
2010-01-17 18:30:07 UTC
Permalink
On 17 Gen, 13:56, "giorgio rancati"
Post by Vladimiro Leone
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Ciao Michele,
Aggiungi un Id contatore, poi elimina i duplicati con questa query
----
DELETE *
FROM Anagrafica
WHERE Id<>(SELECT Min(Id)
           FROM Anagrafica AS A
           WHERE A.Nome=Anagrafica.Nome
             AND A.Cognome=Anagrafica.Cognome
             AND A.DataDiNascita=Anagrafica.DataDiNascita
           );
----
Ciao
--
Giorgio Rancati
[Office Access MVP]
Ciao Giorgio,
1) per caso l'altro giorno ho scoperto "Microsoft Access Forum" link:
http://social.microsoft.com/Forums/it-IT/accessit/threads
Complimenti :-)
2) Visto che riesci a fare di tutto e di più, non sarebbe bello avere
una query solo con i duplicati senza il Distinct?
Ciao Vladimiro.
Michele Menniti
2010-01-18 13:41:56 UTC
Permalink
"Vladimiro Leone" <***@alice.it> ha scritto nel messaggio news:4522d964-9731-4dc2-937e-***@k35g2000yqb.googlegroups.com...
On 17 Gen, 13:56, "giorgio rancati"
Post by Vladimiro Leone
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Ciao Michele,
Aggiungi un Id contatore, poi elimina i duplicati con questa query
----
DELETE *
FROM Anagrafica
WHERE Id<>(SELECT Min(Id)
FROM Anagrafica AS A
WHERE A.Nome=Anagrafica.Nome
AND A.Cognome=Anagrafica.Cognome
AND A.DataDiNascita=Anagrafica.DataDiNascita
);
----
Ciao
--
Giorgio Rancati
[Office Access MVP]
Ciao Giorgio,
1) per caso l'altro giorno ho scoperto "Microsoft Access Forum" link:
http://social.microsoft.com/Forums/it-IT/accessit/threads
Complimenti :-)
2) Visto che riesci a fare di tutto e di più, non sarebbe bello avere
una query solo con i duplicati senza il Distinct?
Ciao Vladimiro.

Ciao Vladimiro,
a rigor di logica dovrebbe bastare usare il SELECT al posto del DELETE, in
questo momento non ho modo di fare la prova, ma penso funzioni.
---
Michele Menniti
Vladimiro Leone
2010-01-18 13:54:07 UTC
Permalink
On 18 Gen, 14:41, "Michele Menniti"
Post by Vladimiro Leone
On 17 Gen, 13:56, "giorgio rancati"
Post by Vladimiro Leone
Post by Michele Menniti
Ho una tabella con oltre 1000 nominativi, dei quali circa il 20% sono
duplicati da eliminare.
Cognome, Nome, DataDiNascita (se serve posso aggiungere un Id)
Devo eliminare SOLO il duplicato, quindi se sono presenti N°2 Rossi Mario
01/01/1980, uno deve restare e l'altro deve essere eliminato.
Ciao Michele,
Aggiungi un Id contatore, poi elimina i duplicati con questa query
----
DELETE *
FROM Anagrafica
WHERE Id<>(SELECT Min(Id)
FROM Anagrafica AS A
WHERE A.Nome=Anagrafica.Nome
AND A.Cognome=Anagrafica.Cognome
AND A.DataDiNascita=Anagrafica.DataDiNascita
);
----
Ciao
--
Giorgio Rancati
[Office Access MVP]
Ciao Giorgio,
1) per caso l'altro giorno ho scoperto "Microsoft Access Forum" link:http://social.microsoft.com/Forums/it-IT/accessit/threads
Complimenti :-)
2) Visto che riesci a fare di tutto e di più, non sarebbe bello avere
una query solo con i duplicati senza il Distinct?
Ciao Vladimiro.
Ciao Vladimiro,
a rigor di logica dovrebbe bastare usare il SELECT al posto del DELETE, in
questo momento non ho modo di fare la prova, ma penso funzioni.
---
Michele Menniti- Nascondi testo citato
- Mostra testo citato -
Hai perfettamente ragione.
Ciao Michele e grazie.
Vladimiro.

Loading...