Aiuto SQL

venerdì 10 luglio 2009 - 09.59

alecomo Profilo | Junior Member

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

>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

>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

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

>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

>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

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);
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