Sehr geehrte Frau Dedl-Fix!
Wer kann Herrn Zwirbel aus seinem Dilemma helfen?
Vielleicht jemand, der nicht nur Joins kennt, sondern auch Correlated Subquerys.
Ihren Vorschlag habe ich Herrn Zwirbel ausgedruckt und vorgelegt. Kaum hatte ich sein Büro verlassen, hörte ich einen lauten Rumms. Herr Zwirbel lag auf dem Boden, hatte glasige Augen und stammelte nur "NxM, NxM". Die lustige Ente auf seinem Bildschirm hatte ihn darauf hingewiesen, dass der Aufwand gegenüber einer einfachen Unterabfrage wohl massiv ansteigen täte - und das war ja nun nicht Sinn der Sache, es grämte ihn doch gerade das unnötige komplette Durcharbeiten der Zwergentabelle, obwohl nur wenige Zwerge in einer Filiale angeboten wurden.
Möglicherweise hat Herr Zwirbel sie aber auch falsch verstanden. Ein Beispiel wäre hilfreich gewesen.
So oder so, ich habe ihn vor die Wahl gestellt, "Herr Zwirbel", habe ich gesagt, "Herr Zwirbel, 60 Jahre bin ich ihre Sekretärin, so geht das nicht! Klöße oder Katheder, Kantine oder Krankenhaus!". Wir haben ihn dann in die Kantine zu Herrn Knubbel zum Kloßessen gekarrt, damit er endlich wieder auf die Beine kommt.
Was soll ich sagen, er kam beseelt lächelnd zurück.
Sollen alle Angebote einer Filiale angezeigt werden, [...]
... dann empiehlt es sich, die Angebote, also die Zwerge, als Hauptquery zu nehmen und die zusätzlichen Daten zu joinen
Nun, die Filialangebote sind doch eigentlich die Preise, nicht die Zwerge?
Wie dem auch sei, nach Ihrem Einwurf kam Herrn Zwirbel der Gedanke, dass er den Zwerg wohl von hinten aufgezäumt hatte. Er hat also nochmal ganz neu angefangen, mit den Preisen zuerst und dann die Zwerge:
select
preise.preis,
ifnull(a.name, b.name) as name,
ifnull(a.variante, b.variante) as variante
from preise
left join zwerge as a on a.nummer = preise.zwerg
left join zwerge as b on a.nummer = b.grundform
where preise.filiale = "abc"
Nach genauerer Betrachtung stellte er fest, dass das dann doch die gleiche Abfrage ist wie vorher, nur ohne die aufwändige Unterabfrage. Aber sie tut, was sie soll, und die Datenbank meldet diesmal für jedes Teilstück, dass ein Index benutzt wird (insbesondere für Tabelle a, wo vorher ein "scan table" dreute). Das ist doch schön.
Möglicherweise war das nicht, was Sie im Sinn hatten, aber Herr Zwirbel freut sich jedenfalls erstmal und bedankt sich für den Denkanstoß.
Mit freundlichen Grüßen,
Ziglinde Zurbel