Hallo,
Ich habe zwei Abfragen die nach meinen Überlegungen eigentlich äquivalent sein sollten.
Da sie das nicht sind würde ich gerne wissen, warum das so ist.
Abfrage 1:
[highlight=sql]
SELECT name,
anschrift
FROM MITARBEITERIN m
WHERE exists
( SELECT sum(Preis*STUECK)
FROM KELLNERIN k
JOIN TISCH t ON t.ZUSTAENDIG=k.pnr
LEFT OUTER JOIN Bestellung bes ON t.RESTNR=bes.RESTNR
AND t.STANDORT=bes.STANDORT
AND t.TISCHNR=bes.TISCHNR
LEFT OUTER JOIN Beinhaltet b ON b.BESTNR=bes.BESTNR
LEFT OUTER JOIN Gericht g ON g.id=b.id
WHERE k.pnr=m.pnr HAVING sum(Preis*STUECK)=
( SELECT min(Umsatz1)
FROM
(SELECT sum(g1.Preis*b1.STUECK) AS Umsatz1
FROM KELLNERIN k1
JOIN TISCH t1 ON t1.ZUSTAENDIG=k1.pnr
LEFT OUTER JOIN Bestellung bes1 ON t1.RESTNR=bes1.RESTNR
AND t1.STANDORT=bes1.STANDORT
AND t1.TISCHNR=bes1.TISCHNR
LEFT OUTER JOIN Beinhaltet b1 ON b1.BESTNR=bes1.BESTNR
LEFT OUTER JOIN Gericht g1 ON g1.id=b1.id
GROUP BY k1.pnr ) ))
[/highlight]
Abfrage 2:
[highlight=sql]
SELECT name,
anschrift
FROM MITARBEITERIN m
JOIN KELLNERIN k ON k.pnr=m.pnr
JOIN TISCH t ON t.ZUSTAENDIG=k.pnr
LEFT OUTER JOIN Bestellung bes ON t.RESTNR=bes.RESTNR
AND t.STANDORT=bes.STANDORT
AND t.TISCHNR=bes.TISCHNR
LEFT OUTER JOIN Beinhaltet b ON b.BESTNR=bes.BESTNR
LEFT OUTER JOIN Gericht g ON g.id=b.id
GROUP BY m.pnr,
anschrift,
name HAVING sum(Preis*STUECK)=
( SELECT min(Umsatz1)
FROM
(SELECT sum(g1.Preis*b1.STUECK) AS Umsatz1
FROM KELLNERIN k1
JOIN TISCH t1 ON t1.ZUSTAENDIG=k1.pnr
LEFT OUTER JOIN Bestellung bes1 ON t1.RESTNR=bes1.RESTNR
AND t1.STANDORT=bes1.STANDORT
AND t1.TISCHNR=bes1.TISCHNR
LEFT OUTER JOIN Beinhaltet b1 ON b1.BESTNR=bes1.BESTNR
LEFT OUTER JOIN Gericht g1 ON g1.id=b1.id
GROUP BY k1.pnr ) )
[/highlight]
Die Zwei Abfragen sollten die Kellner mit dem minimalen Umsatz liefern.
Bei der Ersten funktioniert das, bei der zweiten bekomme ich eine leere Relation zurück.
Das was sich zwischen den Abfragen verändert hat ist, das es statt dem exist einen inner join gibt in dessen on die vorherige where-Bedingung steht. Außerdem wurde eine entsprechendes Group by eingefügt.
BEINHALTET : (BESTNR, ID, STUECK)
BESTELLUNG: (BESTNR, TISCHNR, RESTNR, STANDORT)
GERICHT: (ID, PREIS…)
KELLNERIN: (PNR)
MITARBEITERIN : (PNR, NAME, ANSCHRIFT….)
TISCH: (RESTNR, STANDORT, TISCHNR, ZUSTAENDIG) // ZUSTAENDIG= KELLNERIN.Pnr
Schon mal danke für eure Mühe
Ich habe zwei Abfragen die nach meinen Überlegungen eigentlich äquivalent sein sollten.
Da sie das nicht sind würde ich gerne wissen, warum das so ist.
Abfrage 1:
[highlight=sql]
SELECT name,
anschrift
FROM MITARBEITERIN m
WHERE exists
( SELECT sum(Preis*STUECK)
FROM KELLNERIN k
JOIN TISCH t ON t.ZUSTAENDIG=k.pnr
LEFT OUTER JOIN Bestellung bes ON t.RESTNR=bes.RESTNR
AND t.STANDORT=bes.STANDORT
AND t.TISCHNR=bes.TISCHNR
LEFT OUTER JOIN Beinhaltet b ON b.BESTNR=bes.BESTNR
LEFT OUTER JOIN Gericht g ON g.id=b.id
WHERE k.pnr=m.pnr HAVING sum(Preis*STUECK)=
( SELECT min(Umsatz1)
FROM
(SELECT sum(g1.Preis*b1.STUECK) AS Umsatz1
FROM KELLNERIN k1
JOIN TISCH t1 ON t1.ZUSTAENDIG=k1.pnr
LEFT OUTER JOIN Bestellung bes1 ON t1.RESTNR=bes1.RESTNR
AND t1.STANDORT=bes1.STANDORT
AND t1.TISCHNR=bes1.TISCHNR
LEFT OUTER JOIN Beinhaltet b1 ON b1.BESTNR=bes1.BESTNR
LEFT OUTER JOIN Gericht g1 ON g1.id=b1.id
GROUP BY k1.pnr ) ))
[/highlight]
Abfrage 2:
[highlight=sql]
SELECT name,
anschrift
FROM MITARBEITERIN m
JOIN KELLNERIN k ON k.pnr=m.pnr
JOIN TISCH t ON t.ZUSTAENDIG=k.pnr
LEFT OUTER JOIN Bestellung bes ON t.RESTNR=bes.RESTNR
AND t.STANDORT=bes.STANDORT
AND t.TISCHNR=bes.TISCHNR
LEFT OUTER JOIN Beinhaltet b ON b.BESTNR=bes.BESTNR
LEFT OUTER JOIN Gericht g ON g.id=b.id
GROUP BY m.pnr,
anschrift,
name HAVING sum(Preis*STUECK)=
( SELECT min(Umsatz1)
FROM
(SELECT sum(g1.Preis*b1.STUECK) AS Umsatz1
FROM KELLNERIN k1
JOIN TISCH t1 ON t1.ZUSTAENDIG=k1.pnr
LEFT OUTER JOIN Bestellung bes1 ON t1.RESTNR=bes1.RESTNR
AND t1.STANDORT=bes1.STANDORT
AND t1.TISCHNR=bes1.TISCHNR
LEFT OUTER JOIN Beinhaltet b1 ON b1.BESTNR=bes1.BESTNR
LEFT OUTER JOIN Gericht g1 ON g1.id=b1.id
GROUP BY k1.pnr ) )
[/highlight]
Die Zwei Abfragen sollten die Kellner mit dem minimalen Umsatz liefern.
Bei der Ersten funktioniert das, bei der zweiten bekomme ich eine leere Relation zurück.
Das was sich zwischen den Abfragen verändert hat ist, das es statt dem exist einen inner join gibt in dessen on die vorherige where-Bedingung steht. Außerdem wurde eine entsprechendes Group by eingefügt.
BEINHALTET : (BESTNR, ID, STUECK)
BESTELLUNG: (BESTNR, TISCHNR, RESTNR, STANDORT)
GERICHT: (ID, PREIS…)
KELLNERIN: (PNR)
MITARBEITERIN : (PNR, NAME, ANSCHRIFT….)
TISCH: (RESTNR, STANDORT, TISCHNR, ZUSTAENDIG) // ZUSTAENDIG= KELLNERIN.Pnr
Schon mal danke für eure Mühe
Comment