Entwickler-Ecke

Datenbanken - SQL-Update-Statement: Problem mit GROUP BY


JVS - Mi 09.03.11 20:51
Titel: SQL-Update-Statement: Problem mit GROUP BY
Hallo an alle DB-Spezialisten,

eine Access-DB ist über Delphi-ADOs verbunden.
Die Tabelle KOPF besitzt ein Feld GESAMTWERT, in welches die Summe der zugehörigen Einzelpositionen
(Feld WERT) aus Tabelle EINZELPOS geschrieben werden soll.

Variante 1 (Funktioniert)

Schritt 1:
Update Kopf Set GesamtWert=0

Schritt 2:
Update Kopf
Inner Join
(Select kopfid,wert from EinzelPos) as ep
on ep.kopfid=kopf.id
set GesamtWert=GesamtWert+ep.wert

Variante 2 (Funktioniert nicht)

Das Ganze soll in einem Rutsch passieren, ohne die separate Feldnullung am Anfang.
Die Idee ist wie folgt:

Update Kopf
Inner Join
(Select kopfid,sum(wert) as dieSumme from EinzelPos
Group by kopfid) as ep
on ep.kopfid=kopf.id
set GesamtWert=ep.dieSumme


Das erzeugt den Fehler:
---------------------------
EOleException
Operation muss eine aktualisierbare Abfrage verwenden
---------------------------

Warum?
Verhindert die Verknüpfung der beiden Tabellen über die GROUP BY Klausel die Editierung der Tabelle KOPF?
Hat jemand eine Lösung für die gewünschte 1-Schritt-Aktualisierung?

Gruß und Danke,
JVS


jasocul - Do 10.03.11 09:41

Mal kurz, ohne lange nachzudenken:

SQL-Anweisung
1:
2:
Update Kopf
set Gesamtwert = (Select sum(wert) from EinzelPos where Kopf.id = KopfId)

So würde es zumindest unter Oracle funktionieren. Der join muss auf deiner DB evtl. anders beschrieben werden. Oracle macht es einem da etwas einfacher. :wink:


JVS - Do 10.03.11 10:00

Hi jasocul,

dein Vorschlag erzeugt den gleichen Fehler (EOleException: Operation muss eine aktualisierbare Abfrage verwenden).
Grundsätzlich ist die Syntax also richtig.
Auch Abfragen mit derartigen Verknüpfungen laufen problemlos.

Nur beim UPDATE da hakt es: Warum kann ADO das Feld nicht aktualisieren?
Mystisch...


vagtler - Do 10.03.11 10:03

Ich denke, dass ADO da weniger das Problem ist... :mrgreen:


jasocul - Do 10.03.11 11:02

Versuch es doch mal ohne Delphi/ADO.
Also einfach mal wirklich NUR das SQL-Statement ausführen.


HelgeLange - Do 10.03.11 17:15

ich habe gerade unseren lokalen SQL-Experten gefragt, er denkt auch (wie ich), dass es einfach das Problem ist, dass das Group By statement nur für SELECT ist. Ein UPDATE ist keine aktualisierbare Datenmenge :)


jasocul - Do 10.03.11 17:28

@HelgeLange:
Du hast aber gesehen, dass in meinem Beispiel kein "Group By" enthalten ist, oder?
Und nach Aussage von user profile iconJVS bringt das bei ihm den selben Fehler.

Übrigens funktioniert dieses Statement bei mir ohne Fehlermeldung, wenn ich es direkt ausführe.