Rolf B: Select Ergebnisse aus Join einschränken

Beitrag lesen

Hallo WernerK,

du hast diese Aufgabe also gestellt bekommen, und verstehst sie selbst nicht. Das ist schlecht. Weil - wenn Du es nicht verstehst und uns erklären kannst, wie soll man dann eine Lösung finden?

Es GIBT durchaus SQL Formulierungen, mit denen man eine 1:n-Beziehung auf 1:1 reduzieren kann, es muss dann allerdings eine Regel existieren, die exakt einen Satz findet. Bei Müllers Apfel und Birne - tja. Du hast also Bestellungen, mit einer Bestellnummer. Ob eine Bestellung komplett bei einem Lieferanten erfolgt oder auch auf mehrere Lieferanten verteilt sein kann, das verrät uns dein Beispiel nicht. Nehmen wir also an. Eine bestimmte Bestellung erfolgt vollständig bei einem Lieferanten.

Diese Bestellung umfasst dann mehrere Artikel. Nun kommt die Frage: Welchen Sinn hat es, eine Bestellung mit mehreren Artikeln auf einen Satz zu reduzieren? Entweder suche ich einen bestimmten Artikel, oder ich will die Bestellsumme wissen, oder mich interessieren die Artikel gar nicht. Wenn ich einen bestimmten Artikel suche, dann komme ich ohne Kriterien nicht weiter. Will ich den letzten im Alphabet, den mit dem höchsten Preis - beides trifft auf deine Birne zu.

Die beiden anderen Fälle sind trivial, für die Bestellsumme lässt man den Artikelnamen weg, gruppiert über Bestellnummer und Lieferant und bildet SUM() über die Preise. Und wenn mich die Artikel nicht interessieren, dann joine ich sie nicht hinzu.

Mal angenommen, ich möchte nur den Bestellposten mit dem Artikel haben, der den höchsten Preis hat. Das funktioniert allerdings nur dann, wenn diese Regel eindeutig ist, andernfalls habe ich doch wieder mehrere Sätze. Wie auch immer - man könnte das so machen:

SELECT A.Bestellnummer, A.Lieferant, B.Artikel, B.Preis
FROM BestellTable A JOIN ArtikelTable B ON A.ID = B.ID
WHERE B.Preis = (SELECT MAX(Preis) FROM ArtikelTable C WHERE C.ID=B.ID)

Rolf

--
sumpsi - posui - clusi