Aggiornare campi di una tabella prelevandoli da un'altra tabella

di il
12 risposte

Aggiornare campi di una tabella prelevandoli da un'altra tabella

Buongiorno

Vorrei sottoporvi il seguente problema:

Nel mio db ho una tabella che contiene tutti i comuni italiani, (e svariati paesi stranieri -prov: EE), la provincia, la regione, la sigla della provincia, codice istat…

Ho reperito un file excel, aggiornato all'anno 2021, contenente:

  • - Tutti i comuni, compresi quelli soppressi e/o modificati nel tempo;
  • - Le rispettive sigle di provincia;
  • - Codice istat;
  • - indicatore di “soppresso” qualora il comune (di quel record) sia stato soppresso o modificato nel corso degli anni

Se un comune ha cambiato nome, e poi è stato aggregato ad un altro e poi ha cambiato provincia, comparirebbe in 4 record, tre dei quali contrassegnato come soppresso.

Ho importato il file excel in una nuova tabella di Access, ed ora l'idea era quella di aggiornare la mia tabella originale con i nuovi valori aggiornati, ma considerato il mio livello di preparazione e la varietà di modifiche da fare, ritengo che sia invece conveniente utilizzare direttamente la tabella aggiornata, sulla quale ho solo bisogno di inserire, per ciascuna sigla di provincia, la corrispondente denominazione estesa della provincia e della regione.

Fino a ieri, pensavo che sarebbe stato un'attimo, ma non sembra essere così.

per ridurre i risultati della mia tabella [Comuni] ai soli dati utili (un solo record per ciascuna provincia), ho pensato di utilizzare la query [ElProv]:

SELECT DISTINCT Comuni.SiglaProv, Comuni.Provincia, Comuni.Regione
FROM Comuni
WHERE (((Comuni.SiglaProv)<>"EE"));

L'unico contatto tra le due tabelle può essere solo la sigla della provincia, che è stato utilizzato per il join, in questo modo:

UPDATE Comuni2021 INNER JOIN ElProv ON Comuni2021.Prov = ElProv.SiglaProv SET Comuni2021.Provincia = [ElProv].[Provincia], Comuni2021.Regione = [ElProv].[Regione];

Appena tento di eseguirla, un avviso di Access mi dice “Per l'operazione è necessaria una query aggiornabile”…

Non ho capito perché la query dovrebbe essere aggiornabile se è la tabella quella che deve essere aggiornata.

Se utilizzassi la tabella originale [Comuni] invece della query, restituirebbe più di un milione di risultati (ovviamente).

Qualche anima pia che ha pietà di me, può darmi lumi per favore?

12 Risposte

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    22/12/2022 - Robpagna ha scritto:


    SELECT DISTINCT Comuni.SiglaProv, Comuni.Provincia, Comuni.Regione FROM Comuni WHERE (((Comuni.SiglaProv)<>"EE"));

    E' questa la query Comuni2021?

    Se sì, il comportamento di Access è normale perché si tratta di una query su cui hai eseguito una forma di raggruppamento, data dalla presenza del DISTINCT e pertanto non è aggiornabile.

    Se utilizzi la tabella di partenza, Comuni, perché dovrebbe darti milioni di risultati? Uno per ogni Comune, mettendo in join la sigla della provincia. Ed ovviamente la query di aggiornamento deve aggiornare ogni riga.

    Questa SELECT quanti risultati dà? 

    SELECT Comuni.*, ElProv.* FROM Comuni INNER JOIN ElProv ON Comuni.Prov = ElProv.SiglaProv

    Se non ci sono “buchi” con le province o con le sigle restituisce lo stesso numero di record della tabella Comuni.

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    Grazie per l'attenzione

    La query suggerita restituisce 8439 risultati…

    La tabella Comuni2021 (nuova) contiene 11099 record, mentre la “vecchia” [Comuni] esattamente 8439

    Nella nuova, ci sono delle nuove provincie non esistenti nella vecchia (tipo ad esempio SU - che in parte sostituisce ed implementa CI-Carbonia Iglesias, ex Cagliari) e dei nuovi comuni accorpati e/o che hanno cambiato provincia (es. Alà dei Sardi prima era OT (Olbia Tempio), ora è SS (Sassari).

    In tutti i casi, nella nuova tabella sono presenti tutti gli “aggiornamenti” di ciascun comune, ed è anche per questo che i record sono molti di più.

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    22/12/2022 - Robpagna ha scritto:


    La tabella Comuni2021 (nuova) contiene 11099 record, mentre la “vecchia” [Comuni] esattamente 8439

    Quindi? evidentemente non ho capito quello di cui hai bisogno tra vecchia, nuova ed aggiornamenti. Rispieghi per favore?

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    22/12/2022 - Philcattivocarattere ha scritto:

    Se utilizzi la tabella di partenza, Comuni, perché dovrebbe darti milioni di risultati? Uno per ogni Comune, mettendo in join la sigla della provincia. Ed ovviamente la query di aggiornamento deve aggiornare ogni riga.

    Purtroppo il problema è proprio questo. Sicuramente non tengo conto di qualcosa, ma non funziona come vorrei.

    Utilizzando la query di aggiornamento:

    UPDATE Comuni2021 INNER JOIN Comuni ON Comuni2021.Prov = Comuni.SiglaProv SET Comuni2021.Provincia = [Comuni].[Provincia], Comuni2021.Regione = [comuni].[Regione];
    

    prima di eseguirla, se passo alla visualizzazione tabella, questo è quello che vedo. Una sfilza di righe vuote ed alla fine:

    Se la eseguo, Access si inchioda. 

    Il mio problema consiste nel non essere in grado di popolare i campi della provincia e della regione (della tabella Comuni2021) di ciascun record, attingendo dalla precedente tabella (Comuni).

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    Ma scusami e con il dovuto rispetto. Non sono arrabbiato e non voglio attaccare nessuno.

    Però:
    La relazione tra provincia e comune come avviene?

    Cosa contengono le due tabelle?
    C'è un dato in comune tra le due?

    inoltre, come fai a dire ad access  che il comune di Torino deve essere aggiornato con la provincia di Torino? L'unico elemento che hai è la tua conoscenza? Perchè da quello che mi sembra di capire uno dei due campi è vuoto e vorresti riempirlo con il dato proveniente da un'altra tabella, senza avere nessun dato con cui fare il confronto e poi aggiornare il relativo record.

    Se una delle query che hai scritto dovesse per caso funzionare, comunque ti farebbe vedere tutti i comuni di una determinata provincia e non un singolo comune.

    Che siginifica se la esegui si inchioda?
    Access gestisce oltre 30 mila messaggi di errore!
    Se non dici che errore ti da, come facciamo a capire dove sta errore?
    Non abbiamo di certo la sfera di cristallo.

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    22/12/2022 - Robpagna ha scritto:


    Il mio problema consiste nel non essere in grado di popolare i campi della provincia e della regione (della tabella Comuni2021) di ciascun record, attingendo dalla precedente tabella (Comuni).

    Oh, forse, dico forse ho capito, adesso. 

    Operazione nr. 1, creare una query con solo le province, prendendole dalla tabella nuova.

    SELECT DISTINCT Comuni.SiglaProv, Comuni.Provincia, Comuni.Regione
    FROM Comuni
    WHERE (((Comuni.SiglaProv)<>"EE"));

    che chiameremo qryProvince.

    Operazione nr. 2, una select in ottica dell'update per vedere se ci siamo con quello che ci si propone di fare.

    SELECT Comuni2021.*, qryProvince.SiglaProv, qryProvince.Provincia, qryProvince.Regione
    FROM Comuni2021 INNER JOIN qryProvince ON Comuni.Prov = qryProvince.SiglaProv

    Operazione n. 3, trasformare la query precente in una query di UPDATE, solo ovviamente se eri soddisfato della SELECT

    UPDATE Comuni2021 INNER JOIN qryProvince ON Comuni2021.Prov = qryProvince.SiglaProv 
    SET Comuni2021.Provincia = qryProvince.Provincia, Comuni2021.Regione = qryProvince.Regione
  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    23/12/2022 - Philcattivocarattere ha scritto:

    Operazione n. 3, trasformare la query precente in una query di UPDATE, solo ovviamente se eri soddisfato della SELECT

    UPDATE Comuni2021 INNER JOIN qryProvince ON Comuni2021.Prov = qryProvince.SiglaProv 
    SET Comuni2021.Provincia = qryProvince.Provincia, Comuni2021.Regione = qryProvince.Regione

    La query proposta al punto 2 è perfetta!

    Esatto. Questa è esattamente la procedura che avevo adottato dall'inizio, per la quale però mi veniva restituito l'errore Per l'operazione è necessaria una query aggiornabile”, come descritto al primo post.

    infatti continua a dare il medesimo messaggio… Propongo graficamente la situazione:

    La mia perplessità era (ed è ancora) proprio questa. Non comprendere il motivo dell'errore.

    Non deve essere aggiornata la query, ma la tabella… La query è la fonte del dato, non la destinazione 

    UPDATE Comuni2021” si riferisce proprio alla tabella, 

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    23/12/2022 - Robpagna ha scritto:


    Non deve essere aggiornata la query, ma la tabella… La query è la fonte del dato, non la destinazione 

    La tabella viene aggiornata tramite la query, se la query (per come è costruita) NON è aggiornabile NON puoi aggiornare la tabella.

    Se una query contiene raggruppamenti, se non contiene un campo chiave, se ci sono left/right join molto probabilmente diventa una query NON aggiornabile. A volte può essere utile (far) creare ad una query una tabella temporanea che poi viene utilizzata da una successiva query (questa volta aggiornabile) per ottenere il risultato voluto.

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    Probabilmente occorre trasformare la query n°1 proposta da Phil da query di selezione in query di creazione tabella e poi utilizzarla (la tabella creata) nella query 2 e 3 …

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    23/12/2022 - max.riservo ha scritto:


    A volte può essere utile (far) creare ad una query una tabella temporanea che poi viene utilizzata da una successiva query (questa volta aggiornabile) per ottenere il risultato voluto.

    In base a questo suggerimento di max.riservo trasforma la query dell'operazione nr. 1 in una query di creazione tabella, aggiungi una PK sul campo provincia, per andare sul sicuro, poi usa quella anziché qryProvince.

    (orco can… il max nel frattempo ha scritto e sembra che abbia copiato da lui)

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    22/12/2022 - fratac ha scritto:


    Ma scusami e con il dovuto rispetto. Non sono arrabbiato e non voglio attaccare nessuno.

    Però:
    La relazione tra provincia e comune come avviene?

    Cosa contengono le due tabelle?
    C'è un dato in comune tra le due?

    inoltre, come fai a dire ad access  che il comune di Torino deve essere aggiornato con la provincia di Torino? L'unico elemento che hai è la tua conoscenza? Perchè da quello che mi sembra di capire uno dei due campi è vuoto e vorresti riempirlo con il dato proveniente da un'altra tabella, senza avere nessun dato con cui fare il confronto e poi aggiornare il relativo record.

    Se una delle query che hai scritto dovesse per caso funzionare, comunque ti farebbe vedere tutti i comuni di una determinata provincia e non un singolo comune.

    Che siginifica se la esegui si inchioda?
    Access gestisce oltre 30 mila messaggi di errore!
    Se non dici che errore ti da, come facciamo a capire dove sta errore?
    Non abbiamo di certo la sfera di cristallo.

    Chiedo scusa se non sono stato abbastanza chiaro nell'esporre il mio problema.

    Le due tabelle hanno in comune la sigla della provincia.

    Una di loro (la “vecchia”) contiene tutti i dati, mentre la nuova (alla quale ho aggiunto i campi Provincia e Regione) contiene la sigla della provincia.

    L'esigenza è popolare i campi (ora vuoti) della denominazione completa della provincia e della corrispondente regione, con riferimento alla sigla della provincia già esistente nella nuova tabella. 

  • Re: Aggiornare campi di una tabella prelevandoli da un'altra tabella

    La soluzione proposta da Max.Riservo, ovvero quella di creare una nuova tabella di appoggio da utilizzare per la query di aggiornamento (3), è stata effettivamente risolutiva.

    Rimane l'amaro della perplessità che mi rimane sulla questione.

    A mio avviso la “fonte del dato”, sia esso aggiornabile o meno, non dovrebbe essere oggetto di valutazione da parte di Access.

    Dovrebbe essere solo letto e riversato altrove, in base alle istruzioni che di volta in volta vengono date.

    Comunque, buono a sapersi

    Ringrazio di cuore coloro che hanno inteso offrirmi l'aiuto ed auguro a tutti buone feste.

    GRAZIE!!! 

Devi accedere o registrarti per scrivere nel forum
12 risposte