Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481

    [mysql] normalizzare tabella non normalizzata

    ho una tabella non normalizzata che contiene delle anagrafiche. Il "salame" che ha creato la tabella non ha creato una tabella per i numeri di telefono, e di fronte ad una persona con più numero di telefono (chi non ne ha?!) ha duplicato tutte le informazioni cambiando solo il valore del secondo, terzo ecc numero di telefono...Ora...io dovrei porre rimedio a questo casotto.
    Per capirci un esempio della tabella anagrafiche:
    id, nomecognome, telefono

    esempio di dati
    1-Mario Rossi-3291234567
    2-Mario Rossi-021234567
    3-Luciano Bianchi-336098765
    4-Luciano Bianchi-0698765

    ora, io ho creato una tabella "telefoni", prendendo tutti i telefoni e linkandoli con una foreign key all'id dell'anagrafica...ma poi?! Come faccio a ripulire e normalizzare la tabella anagrafiche? Se faccio una distinct su anagrafiche trovo tutti i nomi e cognomi, ma poi? Se li appoggio su una nuova tabella, poi come faccio a fare l'update della foreign key della tabella telefoni??? Tra l'altro, la INSERT INTO anagrafiche_nuove (nomecognome) SELECT DISTINCT nomecognome FROM anagrafiche ci sta mettendo una vita......

  2. #2
    Ciao,

    scusa ma non era più veloce aggiungere alla tabella anagrafica 5 colonne
    con tel1 tel2 tel3 tel4 tel5 (se uno ha più di cinque numeri di telefono non merita di vivere ) ??


    in ogni caso
    spero che tu abbia linkato i telefoni della tabella telefoni con una foreign key all'id della anagrafiche_nuove...

    cioè il procedimento è questo
    creai anagraficha_nuova
    (es. SELECT DISTINCT nome, cognome FROM anagrafica_vecchia)
    ora hai
    1- Mario Rossi
    2- Rolando Bianchi

    poi creai la insert in tab_telefoni
    (es. CREATE tab telefoni AS select an.num_telefono, an.id from anagrafica_vecchia av, anagrafica_nuova an where an.cognome=av.cognome AND an.nome=av.nome)

    così ora in tab telefoni hai:
    ID ID_ANAG TEL
    1-1-3291234567
    2-1-021234567
    3-2-336098765
    4-2-0698765

    se la select into ci sta mettendo una vita controlla che ci siano gli indici sulla tabella che leggi e di averli disattivati su quella che scrivi (poi li devi riattivare)

  3. #3
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da philbert
    Ciao,

    scusa ma non era più veloce aggiungere alla tabella anagrafica 5 colonne
    con tel1 tel2 tel3 tel4 tel5 (se uno ha più di cinque numeri di telefono non merita di vivere ) ??


    in ogni caso
    spero che tu abbia linkato i telefoni della tabella telefoni con una foreign key all'id della anagrafiche_nuove...

    cioè il procedimento è questo
    creai anagraficha_nuova
    (es. SELECT DISTINCT nome, cognome FROM anagrafica_vecchia)
    ora hai
    1- Mario Rossi
    2- Rolando Bianchi

    poi creai la insert in tab_telefoni
    (es. CREATE tab telefoni AS select an.num_telefono, an.id from anagrafica_vecchia av, anagrafica_nuova an where an.cognome=av.cognome AND an.nome=av.nome)

    così ora in tab telefoni hai:
    ID ID_ANAG TEL
    1-1-3291234567
    2-1-021234567
    3-2-336098765
    4-2-0698765

    se la select into ci sta mettendo una vita controlla che ci siano gli indici sulla tabella che leggi e di averli disattivati su quella che scrivi (poi li devi riattivare)
    ma se uso la CREATE non devo definire tutti i campi? Ma soprattutto, se faccio, così, come faccio a sapere se il telefono è un telefono o un fax? Perché nella tabella vecchia ho due campi, telefono e fax, a volte sono entrambi compilati, a volte uno solo dei due...che genio quello che ha fatto questo archivio!

  4. #4
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da james
    ma se uso la CREATE non devo definire tutti i campi? Ma soprattutto, se faccio, così, come faccio a sapere se il telefono è un telefono o un fax? Perché nella tabella vecchia ho due campi, telefono e fax, a volte sono entrambi compilati, a volte uno solo dei due...che genio quello che ha fatto questo archivio!
    seguendo il tuo esempio sono riuscito ad arrivare ad avere una tabella telefoni con indici corretti ed anche a differenziare (facendo due query distinte e sfruttando la WHERE) i numeri di telefono. Ora mi resta un problema: inizialmente ho fatto una INSERT INTO an SELECT DISTINCT av per avere una tabella pulita dai duplicati, ma mi resta un problema, ora come faccio ad importare in "an" gli altri campi (indirizzo, citta. ecc) da "av"?!

  5. #5
    Originariamente inviato da james
    ma se uso la CREATE non devo definire tutti i campi?
    No, esiste il comando
    CREATE TABLE <nometabella> AS SELECT <campo1>, <campo4> FROM <nometabella2>
    che praticamente crea una tabella al volo con i campi presi dalla select che gli passi..

    Ma soprattutto, se faccio, così, come faccio a sapere se il telefono è un telefono o un fax?

    se hai anche i fax aggiungerai un campo flag alla tab_telefoni
    codice:
    CREATE tab telefoni AS 
    SELECT 
    an.num_telefono, 
    an.id, 
    'N' as FLAG_FAX 
    FROM anagrafica_vecchia av, anagrafica_nuova an WHERE an.cognome=av.cognome 
    AND an.nome=av.nome
    ora in tab_telefoni avrai
    ID ID_ANAG TEL FLAG_FAX
    1-1-3291234567 -N
    2-1-021234567 - N
    3-2-336098765 -N
    4-2-0698765 -N

    poi fai un update del campo FLAG_FAX a 'S' per quei numeri di telefono che sono dei fax

  6. #6
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da philbert
    No, esiste il comando
    CREATE TABLE <nometabella> AS SELECT <campo1>, <campo4> FROM <nometabella2>
    che praticamente crea una tabella al volo con i campi presi dalla select che gli passi..




    se hai anche i fax aggiungerai un campo flag alla tab_telefoni
    codice:
    CREATE tab telefoni AS 
    SELECT 
    an.num_telefono, 
    an.id, 
    'N' as FLAG_FAX 
    FROM anagrafica_vecchia av, anagrafica_nuova an WHERE an.cognome=av.cognome 
    AND an.nome=av.nome
    ora in tab_telefoni avrai
    ID ID_ANAG TEL FLAG_FAX
    1-1-3291234567 -N
    2-1-021234567 - N
    3-2-336098765 -N
    4-2-0698765 -N

    poi fai un update del campo FLAG_FAX a 'S' per quei numeri di telefono che sono dei fax
    sì, nel mio quarto post ti dicevo che il tuo suggerimento è stato PERFETTO, e facendo una query in più sono riuscito a spuntare i fax come tali, mi resta il problema che inizialmente ho fatto una INSERT INTO an SELECT DISTINCT av per avere una tabella pulita dai duplicati, ma ora come faccio ad importare in "an" gli altri campi (indirizzo, citta. ecc) da "av"?!

  7. #7
    scusa ma in che senso????
    avrai ben fatto una INSERT INTO an SELECT DISTINCT av
    prendendo tutti campi univoci (indirizzo, data di nascita ecc.)...

    mica avrai preso solo nome e cognome???

  8. #8
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da philbert
    scusa ma in che senso????
    avrai ben fatto una INSERT INTO an SELECT DISTINCT av
    prendendo tutti campi univoci (indirizzo, data di nascita ecc.)...

    mica avrai preso solo nome e cognome???
    Ho preso solo nome e cognome per un semplice motivo, se faccio una SELECT DISTINCT nome cognome, e se faccio una SELECT DISTINCT con tutti i campi che non cambiano (o meglio che non dovrebbero cambiare), ottengo un numero diverso di risultati, il che significa che, sempre il genio, a volte a scritto male altri campi come indirizzo, ad eccezione del nome cognome...

  9. #9
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da james
    Ho preso solo nome e cognome per un semplice motivo, se faccio una SELECT DISTINCT nome cognome, e se faccio una SELECT DISTINCT con tutti i campi che non cambiano (o meglio che non dovrebbero cambiare), ottengo un numero diverso di risultati, il che significa che, sempre il genio, a volte a scritto male altri campi come indirizzo, ad eccezione del nome cognome...
    Alla fine ho risolto facendo uno script che effettuava ogni query per ciascuna singola istanza duplicata...un mezzo bagno di sangue ma ne sono uscito, ti ringrazio per il tuo supporto philbert

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.