Mit Updateanweisung Feld aufaddieren

hkProg

Benutzer
Beiträge
21
Irgendwie steh ich auf der Leitung!
Folgende Situation vereinfacht dargestellt

Tabelle: Artikel mit ArtNr, ArtBez, verkaufteMenge
1, xx, 0
2, yy, 0

Tabelle: Verkauft mit ArtNr, Menge
1, 2
1 , 3
2, 1
2, 2

Ich will in Tabelle Artikel den Wert verkaufteMenge mit den aktuellen Daten aktualisieren

update Artikel, Verkauft set verkaufteMenge = verkaufteMenge + Menge
where Artikel.ArtNr = Verkauft.ArtNr
-> leider addiert er nicht, sondern überschreibt die Werte nur
jedoch weiß ich noch von Access-SQL her, das diese Syntax funktionierte

Wo liegt mein Denkfehler?
 
Werbung:
Code:
test=*# create table artikel(nr int primary key, menge int);
CREATE TABLE
test=*# create table verkauft(artikel int references artikel, menge int);
CREATE TABLE
test=*# insert into artikel values (1, 0);
INSERT 0 1
test=*# insert into artikel values (2, 0);
INSERT 0 1
test=*# insert into verkauft values (1, 2);
INSERT 0 1
test=*# insert into verkauft values (1, 3);
INSERT 0 1
test=*# insert into verkauft values (2, 1);
INSERT 0 1
test=*# insert into verkauft values (2, 2);
INSERT 0 1
test=*# select * from artikel;
 nr | menge
----+-------
  1 |  0
  2 |  0
(2 Zeilen)

test=*# select * from verkauft ;
 artikel | menge
---------+-------
  1 |  2
  1 |  3
  2 |  1
  2 |  2
(4 Zeilen)

test=*# update artikel set menge = artikel.menge + v.menge from (select artikel, sum(menge) as menge from verkauft group by artikel) v where artikel.nr=v.artikel;
UPDATE 2
test=*# select * from artikel;
 nr | menge
----+-------
  1 |  5
  2 |  3
(2 Zeilen)

test=*#
 
ich möcht aber noch anmerken, daß die Daten in diesem Modell redundant gespeichert sind. Die Probleme, die entstehen, hast Du ja schon erkannt: das, was in der Artikel-Tabelle steht, ist nicht zwingend der aktuell gültige Stand. Besser wäre, die Stammdaten-Tabelle 'artikel' nicht mit Bewegungsdaten (Anzahl der verklauften Artikel) zu füllen, sondern z.B. einen (materialized) View erstellen, der die Verkauft-Tabelle aggregiert.

Du kannst auch, wenn der View zu langsam wäre, eine 'echte' Tabelle dafür nutzen, und diese via TRIGGER aktualisieren. Aber Stamm- und Bewegungsdaten solltest Du NICHT mischen.
 
Werbung:
Zurück
Oben