Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Aiuto SQL
venerdì 10 luglio 2009 - 09.59
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
alecomo
Profilo
| Junior Member
79
messaggi | Data Invio:
ven 10 lug 2009 - 09:59
Buongiorno a tutti
Ho una questione a cui non riesco a dare una soluzione...il mio db è formato da milioni di record e in alcuni casi questi record sono duplicati..io vorrei eliminare questi dublicati. Ad esempio ho due Mario Rossi con uguale codice identificativo..come posso eliminare dalla tabella uno dei due in modo automatico? mi consigliate di usare un trigger? se si in che modo?
grazie!!
micto27
Profilo
| Senior Member
385
messaggi | Data Invio:
ven 10 lug 2009 - 10:06
>Buongiorno a tutti
>Ho una questione a cui non riesco a dare una soluzione...il mio
>db è formato da milioni di record e in alcuni casi questi record
>sono duplicati..io vorrei eliminare questi dublicati. Ad esempio
>ho due Mario Rossi con uguale codice identificativo..come posso
>eliminare dalla tabella uno dei due in modo automatico? mi consigliate
>di usare un trigger? se si in che modo?
>grazie!!
Ciao,
nei casi che dici di dati doppi le 2 righe di Mario Rossi differiscono in qualcosa o hai una situazione di righe identiche?
Di che tipo di database stai parlando?
Michele
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 10 lug 2009 - 10:43
>Buongiorno a tutti
Ciao!
>Ho una questione a cui non riesco a dare una soluzione...il mio
>db è formato da milioni di record e in alcuni casi questi record
>sono duplicati..
Avrai una o più tabelle con milioni di record, il db di suo non ne ha
>io vorrei eliminare questi dublicati. Ad esempio
>ho due Mario Rossi con uguale codice identificativo..come posso
>eliminare dalla tabella uno dei due in modo automatico? mi consigliate
>di usare un trigger? se si in che modo?
Innanzitutto se i duplicati non li vuoi, dovresti aggiungere un vincolo di univocità sui campi, altrimenti il caso potrà sempre riverificarsi. Se vuoi tenere integro il tuo database devi sempre fare vincoli, siano essi foreign key, unique key, check, ecc..
Siccome ormai il danno è fatto, di solito elimino i duplicati andando ad usare la ROW_NUMBER per numerare i record e poi scelgo con una politica che mi sono dato (l'ultimo in ordine di id, oppure quello con una data di inserimento maggiore/minore) però nei miei casi esiste sempre una chiave PRIMARIA univoca e/o una data di inserimento del record, un timestamp. Se i tuoi record sono completamente identici, puoi aggiungere una colonna id IDENTITY per avere la chiave e poi eliminare con la mia tecnica.
Giustamente, come diceva micto27, che RDBMS utilizzi? Com'è fatta la tabella? I record sono esattamente identici?
>grazie!!
di nulla!
--
Alessandro Alpi | SQL Server MVP
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
alecomo
Profilo
| Junior Member
79
messaggi | Data Invio:
ven 10 lug 2009 - 10:59
Grazie per la velocità...
avete ragione...uso oracle...
io ho pensato di fare cosi
creo una nuova tabella "duplicati"
la popolo tramite un insert con tutti i record duplicati in base a una select che estrapola i campi count >1
cancello dalla tab principale le row che non mi servono
è fattibile cosi?
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 10 lug 2009 - 11:08
>avete ragione...uso oracle...
>io ho pensato di fare cosi
>creo una nuova tabella "duplicati"
>la popolo tramite un insert con tutti i record duplicati in base
>a una select che estrapola i campi count >1
>cancello dalla tab principale le row che non mi servono
>è fattibile cosi?
Eh ok, ma come le leghi? Una volta che le hai nei duplicati, quale sarà il criterio di join per eliminare?
Questo significa che hai almeno un campo chiave su cui legarti?
--
Alessandro Alpi | SQL Server MVP
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
micto27
Profilo
| Senior Member
385
messaggi | Data Invio:
ven 10 lug 2009 - 11:09
>Grazie per la velocità...
>avete ragione...uso oracle...
>io ho pensato di fare cosi
>creo una nuova tabella "duplicati"
>la popolo tramite un insert con tutti i record duplicati in base
>a una select che estrapola i campi count >1
>cancello dalla tab principale le row che non mi servono
>è fattibile cosi?
>
non hai spiegato se nel tuo caso si tratta di righe identiche o meno, in ogni caso, nel caso la tua tabella avesse ad esempio una colonna ID gestita con una SEQUENCE
potresti fare
DELETE FROM Tabella t1
where exists
(select 1 from Tabella t2
where t2.IdentiticativoPersona = t1.identificativoPersona
and t2.xxxxxx = t1.xxxxx
and ecc. ecc. (per le varie condizioni che determinano il doppione)
and t2.ID > t1.ID);
a pulizia eseguita prova ad evitare con vincoli di unicità che il problema si verifichi nuovamente.
Se invece le righe sono proprio identiche io aggiungerei una colonna da valorizzare ad esempio con una sequence in modo da differenziarle
farei la pulizia come indicato sopra e poi eliminerei la colonna aggiunta a tale scopo.
Ciao, Michele
a pulizia eseguita
alecomo
Profilo
| Junior Member
79
messaggi | Data Invio:
ven 10 lug 2009 - 12:14
PROBLEMA...devo cambiare la mia via di pensiero perchè la tab è formata da 10000 di record quindi i tempi sono spropositati...devo agire direttamente sulla tabella...come non lo so ora ci penso...
le righe sono identiche...
credo di avere risolto cosi:
DELETE FROM DUP D1
WHERE D1.ROWID > ANY (SELECT ROWID
FROM DUP D2
WHERE D1.CODICE = D2.CODICE);
Torna su
Stanze Forum
Elenco Threads
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 !