Problem bein aktualisieren von Tabellen mit Abfragen --HILFE--

10/10/2007 - 07:28 von Jens N | Report spam
Hallo,
ich steh hier gerade wie ein Ochs vorm Berg und hoffe Ihr könnt mir
helfen.

Ich habe eine Verkaufsdatenbank unter anderen mit einer Bestellungen-,
Bestelldetail- sowie Artikeltabelle.
Ich möchte nun in einer Abfrage bei allen Artikeln die Bestellt wurden
die Gesamtmenge der Bestellungen vom Artikelbestand abziehen. Aber nur
da wo in der Bestellungentabelle beim Feld Erledigt ein Nein steht.

In meinen Versuchen hatte ich entweder den Fehler das jeder bestellte
Artikel nur einmal abgezogen wurde auch wenn er mehrfach bestellt
wurde. Dann habe ich erst die Summe der Menge der bestellten Artikel
gebildet und die Abgezogen aber dann zieht er von jedem Artikel die
Gesamtmenge ab.

Ich denke mal ich habe einen Gedankenfehler und hoffe Sie können mir
auf die Sprünge helfen.

Hier ein Auszug meiner Daten und mein Abfrageversuch:

CREATE TABLE artikel (
artikelnr int,
bezeichnung varchar(80),
lieferant varchar(50),
preis decimal(10,2),
bestand integer,
PRIMARY KEY (artikelnr)
);

CREATE TABLE bestellung(
bestellnr int,
datum datetime,
erledigt bit default 0,
PRIMARY KEY (bestellnr),
);

CREATE TABLE bestelldetail(
bestellnr int CONSTRAINT bestell_fk
FOREIGN KEY REFERENCES bestellung(bestellnr),
artikelnr int CONSTRAINT artikel_fk FOREIGN KEY REFERENCES
artikel(artikelnr),
menge int DEFAULT 1,
PRIMARY KEY (bestellnr, artikelnr)
);


INSERT INTO artikel VALUES('100' , 'G-DATA Wörterbuch Spanisch' , 'G-
DATA' , 30 , 30)
INSERT INTO artikel VALUES('101' , 'IBM Personal Communication 4.3' ,
'IBM' , 489 , 188)
INSERT INTO artikel VALUES('102' , 'IBM ViaVoice Pro' , 'IBM' , 365 ,
37)
INSERT INTO artikel VALUES('103' , 'IBM ViaVoice Standard' , 'IBM' ,
129 , 20)

INSERT INTO bestellung VALUES(100 , '15.02.2000',0);
INSERT INTO bestellung VALUES(101 , '17.02.2000',0);
INSERT INTO bestellung VALUES(102 , '17.02.2000',0);

INSERT INTO bestelldetail VALUES(100 , 103 , 5)
INSERT INTO bestelldetail VALUES(101 , 101 , 2)
INSERT INTO bestelldetail VALUES(101 , 103 , 2)
INSERT INTO bestelldetail VALUES(102 , 101 , 4)



UPDATE artikel
SET artikel.bestand = artikel.bestand - (select sum(menge)from
bestelldetail inner join
artikel on bestelldetail.artikelnr = artikel.artikelnr inner join
bestellung
on bestelldetail.bestellnr = bestellung.bestellnr
where bestelldetail.artikelnr = artikel.artikelnr and erledigt = 0
group by bestelldetail.artikelnr)
from artikel INNER JOIN bestelldetail ON artikel.artikelnr bestelldetail.artikelnr
INNER JOIN bestellung ON bestellung.bestellnr bestelldetail.bestellnr
WHERE bestellung.erledigt = 0;

update bestellung
set erledigt = 1


Vielen Dank im Voraus
Viele Grüße aus dem Rheinland
Jens N
 

Lesen sie die antworten

#1 Hannes Brunner
10/10/2007 - 12:15 | Warnen spam
Hallo Jens,

Jens N schrieb:
Hallo,
ich steh hier gerade wie ein Ochs vorm Berg und hoffe Ihr könnt mir
helfen.



<snip>


UPDATE artikel
SET artikel.bestand = artikel.bestand - (select sum(menge)from
bestelldetail inner join
artikel on bestelldetail.artikelnr = artikel.artikelnr inner join
bestellung



Du darfst hier im Subselect die Tabelle 'artikel' nicht nochmal aufführen.

on bestelldetail.bestellnr = bestellung.bestellnr
where bestelldetail.artikelnr = artikel.artikelnr and erledigt = 0
group by bestelldetail.artikelnr)
from artikel INNER JOIN bestelldetail ON artikel.artikelnr > bestelldetail.artikelnr
INNER JOIN bestellung ON bestellung.bestellnr > bestelldetail.bestellnr
WHERE bestellung.erledigt = 0;



Außerdem würde ich im UPDATE die zusàtzlichen Tabellen nicht joinen
sondern mit EXISTS arbeiten:

UPDATE artikel
SET artikel.bestand = artikel.bestand - (SELECT
Sum(menge)
FROM bestelldetail
INNER JOIN bestellung
ON bestelldetail.bestellnr = bestellung.bestellnr
WHERE bestelldetail.artikelnr = artikel.artikelnr
AND bestellung.erledigt = 0
)
WHERE EXISTS(SELECT * FROM bestelldetail
INNER JOIN bestellung
ON bestellung.bestellnr = bestelldetail.bestellnr
WHERE bestelldetail.artikelnr = artikel.artikelnr
AND bestellung.erledigt = 0
)

Gruß
Hannes

Ähnliche fragen