2009-04-24 12 views
5

Sto tentando di aggiornare tutti i record in una tabella con i valori trovati in un'altra tabella.Access DB aggiorna una tabella con valore da un'altra

Ho provato molte versioni della stessa query di base e sempre ottengo lo stesso messaggio di errore:

operazione è necessaria una aggiornabile query.

Qualche idea sul motivo per cui questa query non funzionerà in Access DB?

UPDATE inventoryDetails as idet 
SET idet.itemDesc = 
(
    SELECT bomItemDesc 
    FROM BOM_TEMPLATES as bt 
    WHERE bt.bomModelNumber = idet.modelNumber 
) 

provato anche questo, perché mi sono reso conto che a partire dalla seconda tabella ha più record numero di modello per ogni ModelNumber - e ho solo bisogno la prima descrizione del primo record trovato per ciascun numero di modello.

UPDATE inventoryDetails as idet 
SET idet.item_desc = 
(
    SELECT TOP 1 bomItemDescription 
    FROM BOM_TEMPLATES as bt 
    WHERE bt.bomModelNumber = idet.modelNumber 
) 

... continua a ottenere lo stesso errore.

+0

I join sono sempre migliori come punto di partenza di una sottoquery in Access/Jet perché sono ottimizzati meglio (sebbene molte sottoquery siano ottimizzate ottimamente - non solo tutti i tipi di esse). –

+1

Il messaggio di errore, "L'operazione deve utilizzare una query aggiornabile" può sembrare un po 'strano; Voglio dire, la (sotto) query non è la parte che viene aggiornata, giusto? Quello che devi capire è che in Access-speak tutto il DML SQL viene definito come una "query", ad es. fai in modo che le persone dicano "ossimoro" come "una query di aggiornamento" quando si riferiscono a un aggiornamento dell'istruzione SQL * *. – onedaywhen

+0

... e questo genere di cose non è realmente colpa: la documentazione di Access lo incoraggia usando questa terminologia per es. 'aggiungi query' per indicare INSERT INTO * statement *. – onedaywhen

risposta

10

Devi usare un join

UPDATE inventoryDetails 
INNER JOIN BOM_TEMPLATES ON inventoryDetails.modelNumber = BOM_TEMPLATES.bomModelNumber 
SET inventoryDetails.itemDesc = [bomItemDesc]; 
+1

Grazie. Penso che stavo facendo UPDATE, SET, INNER JOIN (in questo ordine). – m42

0

prova:

update idet 
SET idet.itemDesc = bt.bomItemDesc 
from inventoryDetails as idet 
    inner join BOM_TEMPLATES as bt 
      on bt.bomModelNumber = idet.modelNumber 

Questo è come vorrei scrivere per server SQL. Hope Access capisce lo stesso comando.

+0

Le query relative all'accesso e al server SQL raramente hanno la stessa sintassi ... –

+0

L'accesso si blocca a partire dalla parte FROM. Avevo provato un numero di versioni simili a questo. – m42

2

Any thoughts on why this query won't work in Access DB?

La risposta è, perché la sintassi ACE/Jet SQL non è conforme a SQL-92 (anche quando nella modalità interrogazione ANSI-92!).

Suppongo che la tua sia una sottoquery scalare. Questo costrutto semplicemente non è supportato da ACE/Jet.

ACE/Jet ospita un eccentrico e imperfetta UPDATE..JOIN sintassi, viziata perché il motore non forza i valori di ED JOIN essere scalari ed è libero di utilizzare silenziosamente un valore arbitrario. È diverso ancora dalla sintassi UPDATE..JOIN di SQL Server, ma almeno SQL Server supporta la subquery scalare Standard come alternativa. ACE/Jet ti costringe a imparare le sue strane modalità non portatili o ad usare un prodotto SQL alternativo.

Mi spiace di sembrare negativo: il motore ACE/Jet è un ottimo software ma la sintassi UPDATE è assolutamente fondamentale e il fatto che non sia stata modificata poiché lo standard SQL-92 mostra davvero la sua età.

Problemi correlati