UPDATE con valori restituiti da SUBQUERY

martedì 26 ottobre 2010 - 10.40
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows XP  |  Visual Studio 2005  |  Access (.mdb)  |  Office 2007

Barabas Profilo | Junior Member

Salve a tutti,
ho un database Access 2007 che semplificando è di questo tipo:
2 tabelle uguali, PRIMA e SECONDA che hanno i seguenti campi:
ID di tipo contatore,
NOME di tipo stringa,
VALORE di tipo numerico
e ID2 di tipo numerico
vorrei fare una query di UPDATE che mi aggiorni SECONDA.ID2 mettendoci gli ID della prima tabella il cui campo VALORE è uguale al campo VALORE della seconda tabella.
Ho consultato un manuale sql McGraw-Hill che dice che posso farlo con una query del tipo:

update seconda set id2=(select id from prima where prima.valore=seconda.valore)

purtroppo Access mi restituisce l'errore:
"Per l'operazione è necessaria una query aggiornabile. (Errore 3073)
Si è tentato di eseguire, aprire o modificare una query non aggiornabile.
Possibili cause:
Si è tentato di eseguire una query che ha cercato di aggiornare un campo che non può essere aggiornato. La query, ad esempio, potrebbe essere stata creata in modo da eseguire un tentativo di aggiornare un campo del lato "uno" di una relazione uno-a-molti. ..."

Inoltre cercando in rete ho notato che il problema si presenta molto spesso nella programmazione WEB quando non si hanno i diritti di modifica, ma non è il mio caso, io sono in locale e i diritti ce li ho.

Vorrei capire se è ACCESS 2007 che non può eseguire una query del genere o è il manuale che sto leggendo che non è corretto, o se devo impostare qualcosa di particolare per rendere la mia query aggiornabile.

Gazie in anticipo
Ciao
Barabas

PS ho trovato questo post
http://it.w3support.net/index.php?db=so&id=170578
dove si dice che il problema è che il motore JET di Access non è completamente compatibile con lo standard SQL per l'istruzione update, e riporta questo articolo della Microsoft con alcuni workaround:
http://support.microsoft.com/default.aspx?scid=kb;en-us;116142&produc
in pratica suggerisce 3 modi:
1) processare un record alla volta: impossibile sono troppi.
2) usare una tabella temporanea: sigh quelle sono già tabelle temporanee...
3) usare una Domain Function: non ho idea di cosa sia...

boccia75 Profilo | Junior Member

La prima cosa che ti chiedo è questa: per un dato valore del campo valore, sei sicuro di avere l'univocità del campo id?
Se il campo valore vale 100 e per quel valore ho due id, come dovrebbe lavorare la query secondo te?
Per me il problema è tutto lì.

dinoxet Profilo | Senior Member

PERCHè NON CI POSTI IL DB CON LE DUE TABELLE E QUALCHE DATO DI ESEMPIO?



DINOXET
__________________________________________
impossible is only a word

Barabas Profilo | Junior Member

Grazie dell'indicazione, ma nel database che sto usando per testare i valori del campo VALORE sono progressivi quindi all'interno di una singola tabella non ce sono 2 uguali.
Sinceramente all'inizio non ci avevo pensato e quindi è stato per caso che l'ho fatto così, resta comunque che non è questa la causa del problema.
Barabas

Barabas Profilo | Junior Member

Posso anche postarlo, appena capisco come fare, ma non è niente di speciale, solo le 2 tabelle che ho descritto, l'ho fatto apposta per provare nel modo più semplice possibile e per essere sicuro che l'errore non fosse causato da qualcosa di più difficile da notare in un contesto più complesso.
Barabas

dinoxet Profilo | Senior Member

basta cliccare su allega un file (deve essere in formato zip)
DINOXET
__________________________________________
impossible is only a word

Barabas Profilo | Junior Member

ho caricato in allegato il db di prova
Barabas

dinoxet Profilo | Senior Member

PROVA COSì :

UPDATE prima INNER JOIN seconda ON prima.valore = seconda.valore SET seconda.id2 = [prima]![id];


DINOXET
__________________________________________
impossible is only a word

Barabas Profilo | Junior Member

Funziona, grazie mille!! Non avevo mai usato la JOIN per fare l'UPDATE, sinceramente non pensavo neanche che fosse possibile.
Grazie ancora anche per avermi fatto imparare una cosa nuova.
Barabas

gianphydnh Profilo | Newbie

>PROVA COSì :
>
>UPDATE prima INNER JOIN seconda ON prima.valore = seconda.valore
>SET seconda.id2 = [prima]![id];
>
>
>DINOXET
>__________________________________________
>impossible is only a word

Ciao DINOXET
io ho un problema simile ed avrei bisogno del tuo aiuto, visto che sei parecchio in gamba col SQL.

Mi daresti una mano?

dinoxet Profilo | Senior Member

Di pure ma magari apri un post
Nuovo
Tutti se possiamo ti dirtemo la nostra
DINOXET
__________________________________________
impossible is only a word

gianphydnh Profilo | Newbie

Grazie,
l'ho appena pubblicato, unitamente al file di Access 2010 ed a una breve spiegazione del problema.
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5