Operation muss eine aktualisierbare Abfrage verwenden. (Fehler 3073) Microsoft Access
Ich habe dies geschrieben-Abfrage:
UPDATE tbl_stock1 SET
tbl_stock1.weight1 = (
select (b.weight1 - c.weight_in_gram) as temp
from
tbl_stock1 as b,
tbl_sales_item as c
where
b.item_submodel_id = c.item_submodel_id
and b.item_submodel_id = tbl_stock1.item_submodel_id
and b.status <> 'D'
and c.status <> 'D'
),
tbl_stock1.qty1 = (
select (b.qty1 - c.qty) as temp1
from
tbl_stock1 as b,
tbl_sales_item as c
where
b.item_submodel_id = c.item_submodel_id
and b.item_submodel_id = tbl_stock1.item_submodel_id
and b.status <> 'D'
and c.status <> 'D'
)
WHERE
tbl_stock1.item_submodel_id = 'ISUBM/1'
and tbl_stock1.status <> 'D';
Habe ich diese Fehlermeldung:
Operation must use an updatable query. (Error 3073) Microsoft Access
Aber wenn ich die gleiche Abfrage in SQL Server ausgeführt werden soll.
Dank,
dinesh
InformationsquelleAutor | 2009-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ziemlich sicher, dass das JET-DB-Engine behandelt jede Abfrage mit einer Unterabfrage als nicht aktualisierbar. Dies ist wahrscheinlich der Grund für den Fehler und, so, müssen Sie zu überarbeiten, die Logik und vermeiden Sie die Unterabfragen.
Als test, können Sie auch versuchen, zu entfernen die Berechnung (Subtraktion) durchgeführt wird, in jedem der beiden Unterabfragen. Diese Berechnung kann nicht sein, spielt schön mit dem update.
"Die wichtigste Frage ist, ob oder nicht Jet/ACE beheben kann, die Art der Beziehung, so dass es eindeutig gesagt, die einzigen Datensatz aktualisieren" - na ja, die Access-Datenbankmodul-UPDATE..JOIN-syntax nicht erforderlich ist, eindeutige Werte: in der Tat, wenn es nicht produzieren mehrdeutige Werte es wird still pick willkürlich und es ist schwierig vorherzusagen, welche abgeholt werden (unsere alten Favoriten über PKs und Cluster auf der Festplatte, vermute ich). Die fehlende Unterstützung für die Skalare Unterabfragen in der UPDATE-SET-Klausel ist IMO die Access-Datenbank-engine schlimmsten 'design feature' (Lesen 'bug').
InformationsquelleAutor Ben Griswold
Betrachten Sie dieses sehr einfache UPDATE-Anweisung mit Nordwind:
Schlägt es fehl, mit der Fehlermeldung "Operation muss eine aktualisierbare Abfrage verwenden'.
Die Access-Datenbank-engine einfach nicht unterstützt SQL-92-syntax, eine Skalare Unterabfrage in der
SET
- Klausel.Die Access-Datenbank-engine hat Ihre eigenen proprietären
UPDATE..JOIN..SET
syntax, ist aber unsicher, da Sie, im Gegensatz zu einer skalaren subquery ist es nicht erforderlich, dass die Werte eindeutig sein. Wenn die Werte nicht eindeutig sind dann der Motor stumm 'picks' eine willkürlich und es ist schwierig (wenn nicht unmöglich), um vorherzusagen, welche angewendet werden, selbst wenn Sie sich dessen bewusst waren das problem.Betrachten Sie zum Beispiel die vorhandenen
Categories
- Tabelle in der Northwind und die folgenden daft (nicht-)Tabelle als Ziel für ein update (daft, sondern einfach zu zeigen das problem klar und deutlich):Nun für die
UPDATE
:Wenn ich diesen starte, mir gesagt wird, dass zwei Zeilen wurden aktualisiert, komisch, weil es nur eine übereinstimmende Zeile in der Tabelle Kategorien. Das Ergebnis ist, dass die
Categories
Tabelle mitCategoryID
jetzt hat '...oder diese? " Wert. Ich vermute, es wurde ein Rennen, um zu sehen, welcher Wert wird in die Tabelle geschrieben, letzten.Dem SQL-92-Skalare Unterabfrage ist ausführlich, wenn es mehrere Klauseln in der
SET
und/oder in der WHERE-Klausel entspricht derSET
's Klauseln, aber zumindest ist es beseitigt die Mehrdeutigkeit (plus eine anständige optimizer sollte in der Lage sein, erkennt, dass die Unterabfragen sind in der Nähe spielen). Der SQL-99 Standard eingeführtMERGE
die verwendet werden können, die zur Beseitigung der oben erwähnten Wiederholung aber unnötig zu sagen, dass Access nicht unterstützt, entweder.Die Access-Datenbank-engine der fehlenden Unterstützung für SQL-92-Skalare Unterabfrage syntax ist für mich seine Schlimmste 'design feature' (Lesen 'bug').
Beachten Sie auch die Access-Datenbank-engine-der proprietären
UPDATE..JOIN..SET
syntax nicht ohnehin benutzt werden, mit set-Funktionen ('Summen Abfragen" in Access-sprechen). Sehen Update-Abfrage Basierend auf Summen die Abfrage schlägt Fehl.Ich denke eher du weißt, was meine Lösung für die "Access kann nicht selbst ausführen einer SQL-92
UPDATE
problem" ist 😉Datenbank-engine hat Fälle [von Ansichten] das sollte theoretisch aktualisierbar sind das nicht" - ich war heute erinnert ein tolles Zitat, das stammt aus dem Jahr 1693: "Der Herzog von Ormond nahm einen Blick gestern von seiner Truppe, und ordnete an, dass alle, die hatten die Bucht oder graue Pferde, Sie zu ändern für schwarz", gedacht, um die früheste bekannte Beispiel für eine Ansicht aktualisieren 😉
InformationsquelleAutor onedaywhen
Halten Sie im Verstand, wenn Sie über eine Abfrage, die ursprünglich Abfragen oder Zusammenfassung Abfragen als Teil der Abfrage, auch wenn Sie das löschen von Abfragen und haben nur miteinander verknüpften Tabellen die Abfrage (versehentlich) handeln, wie es hat immer noch nicht aktualisierbare Felder aus und geben Sie diesen Fehler. Sie einfach nur neu erstellen Sie die Abfrage, wie Sie wollen, aber es ist eine heimtückische kleine Panne.
InformationsquelleAutor Scott Wilbur
Aktualisierung
weight1
undqty1
mit Werten, die wiederum abgeleitet vonweight1
undqty1
(jeweils). Das ist der Grund, warum MS-Access ist erstickt an dem update. Es ist wahrscheinlich auch dabei einige Optimierungen im hintergrund.Den Weg, den ich bekommen würde, um dieses ist, um dump werden die Berechnungen in eine temporäre Tabelle, und aktualisieren Sie dann die erste Tabelle aus der temporären Tabelle.
Warum ist, dass der Mangel in Jet/ACE rechtfertigen downvoting diese Antwort, die ist in der Tat eine praktikable Lösung für das problem? Mir scheint, deine Haarspalterei ist mit Jet/ACE, nicht mit dieser Antwort.
InformationsquelleAutor BIBD
Ist es kein Fehler im code. Aber der Fehler wird Ausgelöst, weil der folgenden Gründen.
angenommen, Sie sind gespeichert, die Datenbank (MS-Access-Datei) in nur-lese-Ordner, die beim ausführen der Anwendung wird die Verbindung nicht mit Gewalt-vollständig geöffnet ist. Daher ändern Sie die Berechtigung für Datei /Ordner Berechtigung wie in
C:\Program files
alle die meisten alle c-Laufwerk Dateien, die eingestellt wurden nur-lese - so ändern diese Berechtigung löst dieses Problem.InformationsquelleAutor Mark Macneil Bikeio
In den query-Eigenschaften, versuchen Sie, ändern der Recordset-Typ auf Dynaset (Inkonsistente Aktualisierungen)
warum sind Sie downvoting Antworten, wenn Sie tatsächlich gemeint sein downvoting Jet/ACE?
Die Frage ist im wesentlichen, "Warum funktioniert mein SQL Server query nicht ausführen in Access (ass, Jet, whatever)?" Ändern der Recordset-Typ findet sich der Punkt vollständig, daher der downvote. Für downvoting Jet/ACE, wenn es nur so einfach, sondern dauert über ein Jahrzehnt, die Menschen aufzuklären täglich über seine vielen Fehler und ich stehe zu meiner Behauptung, "Die Access-Datenbank-engine der fehlenden Unterstützung für SQL-92-Skalare Unterabfrage syntax ist für mich seine Schlimmste 'design feature' (Lesen 'bug')."
InformationsquelleAutor Patrick Honorez