2009-04-24 13 views
5

Ich versuche, alle Datensätze in einer Tabelle mit den Werten in einer anderen Tabelle zu aktualisieren.Access DB Update eine Tabelle mit Wert von einem anderen

Ich habe viele Versionen der gleichen grundlegenden Abfrage versucht und erhalten immer die gleiche Fehlermeldung:

Operation muss eine aktualisierbare Abfrage verwenden.

Haben Sie irgendwelche Gedanken darüber, warum diese Abfrage in Access DB nicht funktioniert?

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

versuchte auch, weil ich erkennen, dass da die zweite Tabelle mehrere Modellnummern Datensätze für jede Modellnummer hat - und ich die erste Beschreibung aus dem ersten Datensatz für jede Modellnummer gefunden nur brauchen.

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

... immer noch den gleichen Fehler bekommen.

+0

Joins sind immer besser als Ausgangspunkt für eine Unterabfrage in Access/Jet, weil sie besser optimiert sind (obwohl viele Unterabfragen gut optimiert sind - nur nicht alle Arten von ihnen). –

+1

Die Fehlermeldung "Operation muss eine aktualisierbare Abfrage verwenden" klingt etwas seltsam. Ich meine, die (Sub-) Abfrage ist nicht der Teil, der gerade aktualisiert wird, oder? Was Sie verstehen müssen, ist, dass in Zugriffssprache alle SQL-DML als eine "Abfrage" bezeichnet wird, z. Sie bekommen Leute, die scheinbar Oxymoron sagen, wie zum Beispiel eine 'update query', wenn sie sich auf eine update SQL * -Anweisung * beziehen. – onedaywhen

+0

... und solche Leute sind nicht wirklich schuld: Die Access-Dokumentation fördert dies, indem sie eine solche Terminologie z. "Anfrage anhängen" bedeutet INSERT INTO * -Anweisung *. – onedaywhen

Antwort

10

Sie ein

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

Danke. Ich glaube, ich habe UPDATE, SET, INNER JOIN (in dieser Reihenfolge) gemacht. – m42

0

Versuch:

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

Dies ist, wie ich es für SQL Server schreiben würde. Hope Access versteht den gleichen Befehl.

+0

Access-und Sql Server-Abfragen haben selten die gleiche Syntax ... –

+0

Zugriff hängt ab dem FROM-Teil. Ich hatte einige ähnliche Versionen ausprobiert. – m42

2

Any thoughts on why this query won't work in Access DB verwenden müssen beitreten?

Die Antwort ist, weil ACE/Jet SQL-Syntax nicht SQL-92-kompatibel ist (auch wenn in seinem ANSI-92-Abfragemodus!).

Ich nehme an, Ihre ist eine skalare Unterabfrage. Dieses Konstrukt wird von ACE/Jet einfach nicht unterstützt.

ACE/Jet hat seine eigene schrullige und fehlerhafte UPDATE..JOIN Syntax, fehlerhaft, weil die Engine die JOIN ed Werte nicht skaliert und es ist frei, einen beliebigen Wert stillschweigend zu verwenden. Es unterscheidet sich wiederum von der SQL Server-eigenen Syntax UPDATE..JOIN, aber zumindest unterstützt SQL Server die skalare Standardunterabfrage als Alternative. ACE/Jet zwingt Sie, entweder seine schrulligen, nicht portablen Möglichkeiten zu erlernen oder ein alternatives SQL-Produkt zu verwenden.

Es tut mir leid, das klingt negativ: die ACE/Jet-Engine ist ein großartiges Stück Software, aber UPDATE-Syntax ist absolut fundamental und die Tatsache, dass es nicht seit dem SQL-92 Standard wirklich geändert worden ist.

Verwandte Themen