Wann braucht man Unteranfragen
-
Ich bin bei SQL-Queries immer noch nicht immer 100% sicher, ob ich eine Unteranfrage brauche, oder ob ich es auch mit Joins loesen kann.
Hier ein Beispiel:
Folgende Anfrage:Finden Sie die Verteidiger, die in mindestens einem Spiel ein Tor geschossen haben, in diesem jedoch nicht verwarnt wurden. Sortieren Sie das Ergebnis nach den Mannschaften.
Die Schemata dazu findet ihr hier: http://www-db.in.tum.de/teaching/ws0607/DBSYS/exercises/Loesung02.pdf
Mein Loesungsvorschlag(ohne Unteranfragen):
select s.* from Spieler sp, Tore t, Spiel s, Verwarnung v where sp.Position='Defender' and sp.SpielerID = t.SpielerID and t.SpielID=s.ID and not(s.SpielerNr = v.SpielerNr) and v.SpielID = s.ID order by s.Land
Die Musterloesung hingegen benutzt eine not exists Unteranfrage:
select s.* from Spieler s, Tore t where s.SpielerNr = t.SpielerNr and Position = ’Defender’ and not exists ( select * from Verwarnung v where v.SpielerNr = s.SpielerNr and v.SpielID = t.Spiel) order by s.Land;
Ist meins falsch, oder sind beide richtig?
Wie kann ich entscheiden, ob ich eine Unteranfrage brauche, oder ob ich alles mit Joins machen kann?thx in advance
-
Hallo,
in diesem Fall benötigst Du die Unterabfrage. In Deiner Lösung werden aus der Tabelle Verwarnungen alle Datensätze verwendet, deren Spieler-Id ungleich der Spieler-Id aus der Tabelle Spiel sind.
Je nach eingetragenen Daten, könnnte Dein Select zwar das richtige Ergebnis liefern, aber aus den falschen Gründen. Sobald Du die Daten zur Anzeige, aus mehr als einer Tabelle wählst, wirst Du feststellen, dass eine Vervielfältigung der Daten stattfindet: Der aktuell in Spiel ausgewählte Spieler wird so oft dargestellt, wie es Einträge in der Tabelle Verwarnungen gibt, bei denen die Spieler-Id unteschiedlich ist.Wenn ich das so lese, hoffe ich, es findet sich jemand der es besser erklären kann...