Selbsttest SQL

5 Produkte mit höchstem Preis finden

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Selbsttest SQL
Die Lösung des Tests sagt, dass so die 5 größten Räume ausgegeben werden:

Raum(RaumNr, Grundfläche, Raumverantwortlicher)

SELECT r1.RaumNr, COUNT() as Rang
FROM Raum r1, Raum r2
WHERE r1.Grundfläche < = r2.Grundfläche
GROUP BY r1.RaumNr
HAVING COUNT(
) <= 5

der Versuch das ganze mit der Übungsdatenbank ausgeben zu lassen:

SELECT r1.artikelnummer, COUNT() as Rang
FROM produkt r1, produkt r2
WHERE r1.preis <= r2.preis
GROUP BY r1.artikelnummer
HAVING COUNT(
) <= 5

Ich bekomme jedoch gar keine lösung in der Datenbank angezeigt. Kann mir jemand sagen wo mein Fehler diesbezüglihc ist ?


Dein “Fehler” ist, dass es 15 Produkte gibt, die am teuersten (599.99) sind.
D.h. das “HAVING COUNT(*) <= 5” trifft nie zu.

Schau Dir die Einträge in “Produkt” einfach mal per

SELECT Preis, COUNT(*) AS anz FROM Produkt
GROUP BY preis
ORDER BY Preis DESC;

an.

Gruß


ich hätte eine Frage , wegen die Anfrage .

ich verstehe nicht , warum in der WHERE-klausel eine <= angegeben wird ? …

kann jemand mir das kurz erklären , weil ich gedacht habe , da wir in GROUP BY nach r1 gruppieren , dann muss die Fläche von r1 auch größer als das andere sein …

wie geht das genau ? …

vielen Dank im Voraus


  • Kreuzprodukt der Raum-Tabelle (n Einträge) mit sich selbst
  • Zwischergebnis mit n² Zeilen
  • eher uncool
  • WHERE-Bedingung: wir wollen nur die Zeilen behalten, bei denen die r1.Grundfläche <= der r2.Grundfläche ist
  • für den Raum mit der größten Grundfläche bleibt nur eine Zeile übrig (wegen des <=)
  • nach r1.RaumNr gruppieren
  • man bekommt zu jedem Raum die Anzahl an Räumen, die eine kleinere oder gleiche Grundfläche haben (COUNT(*) as Rang)
  • größter Raum hat nur eine Zeile in der Ergebnismenge, der zweitgrößte zwei usw.
  • wenn man z.B. die fünf Räume mit der größten Grundfläche will, dann löst man das über das HAVING, weil man da nach der Gruppenbildung aussortieren kann
  • Profit

Anmerkung: Daher sollte auch logisch sein, dass dieses Vorgehen bei einigen Einträgen mit den gleichen Werten für die entscheidenden Attribute eher ungeeignet ist. Aber das hat info2015 ja schon festgestellt :slight_smile: