Supportnet / Forum / Datenbanken
Hilfe, verstehe ein SQL-Testbeispiel nicht :-(
Frage
Da ich in den nächsten Tagen eine fette SQL-Prüfung hab, bekamen wir einige Unterlagen zum Üben (zum Glück mit Lösung). Ein Beispiel ist mir jedoch nicht klar:
Gesucht sind Namen (name) und Nation (nation) aller Läuferinnen, die bei jedem Riesentorlauf (typ='RTL') gepunktet haben. Es existieren die Tables laeuferin, ergebnis und bewerb. 'name' und 'gebdat' sind die primary keys von laeuferin und ergebnis, 'bewerbnr' der primary key von ergebnis und bewerb. 'typ' ist ein Attribut von bewerb, 'nation' eines von laeuferin.
Ich hab mir 2 Lösungen überlegt:
select a.name, a.nation
from laeuferin a, ergebnis b, bewerb c
where c.typ=’RTL’ and a.name=b.name and a.gebdat=b.gebdat and b.bewerbnr=c.bewerbnr;
select a.name, a.nation
from laeuferin a
where exists (
select * from ergebnis b where a.name = b.name and a.gebdat = b.gebdat and exists (
select * from bewerb c where b.bewerbnr=c.bewerbnr and c.typ = ‘RTL’));
Die Lösung laut Professor lautet jedoch:
select a.name, a.nation
from laeuferin a
where not exists (
select * from bewerb c where typ=’RTL’ and not exists (
select * from ergebnis b where a.name = b.name and a.gebdat = b.gebdat and b.bewerbnr=c.bewerbnr));
Was ich nun nicht verstehe: wieso wird hier "not exists" verwendet ? Vielleicht kann mir das jemand erklären !
Antwort 1 von Michael.schon.vergeben
Ist doch logisch: wenn sie nicht existieren, suche mal wo anders, ob du sie findest?!
Antwort 2 von Real Milo
Ich glaub, ich habs zu kompliziert ausgedrückt. Gesucht ist:
"Namen (name) und Nation (nation) aller Läuferinnen, die bei jedem Riesentorlauf (typ='RTL') gepunktet haben."
Die Lösung unseres Professors dazu lautet:
select a.name, a.nation
from laeuferin a
where not exists (
select * from bewerb c where typ=’RTL’ and not exists (
select * from ergebnis b where a.name = b.name and a.gebdat = b.gebdat and b.bewerbnr=c.bewerbnr));
Was ich nicht verstehe: ich will doch wissen, wer gepunktet hat, nicht, wer nicht gepunktet hat. Warum sucht er dann nach nicht-existenten Einträgen ? Ich würde das mit "exists" machen.
"Namen (name) und Nation (nation) aller Läuferinnen, die bei jedem Riesentorlauf (typ='RTL') gepunktet haben."
Die Lösung unseres Professors dazu lautet:
select a.name, a.nation
from laeuferin a
where not exists (
select * from bewerb c where typ=’RTL’ and not exists (
select * from ergebnis b where a.name = b.name and a.gebdat = b.gebdat and b.bewerbnr=c.bewerbnr));
Was ich nicht verstehe: ich will doch wissen, wer gepunktet hat, nicht, wer nicht gepunktet hat. Warum sucht er dann nach nicht-existenten Einträgen ? Ich würde das mit "exists" machen.
Antwort 3 von piano
Hallo
Vielleicht hilft folgende Erklärung:
die andere Schreibweise bringts:
Es darf keine Bedingung wahr sein (äußere Bedingung), daß ein RTL stattfindet ohne Beteiligung der Läuferin (innere Bedingung). Daher muß
?? alles klar ?? ich hoffe, die Erklärung ist nicht komplizierter als die Aufgabe geworden !!!
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Vielleicht hilft folgende Erklärung:
die andere Schreibweise bringts:
SELECT a.name, a.nation
FROM laeuferin AS a
WHERE (((Exists (select * from bewerb c where typ="RTL" and not exists (
select * from ergebnis b where a.name = b.name and a.gebdat = b.gebdat and b.bewerbnr=c.bewerbnr)))=False));Es darf keine Bedingung wahr sein (äußere Bedingung), daß ein RTL stattfindet ohne Beteiligung der Läuferin (innere Bedingung). Daher muß
select * from ergebnis b where a.name = b.name and a.gebdat = b.gebdat and b.bewerbnr=c.bewerbnr für keinen Bewerb vom Typ "RTL" Falsch ergeben!?? alles klar ?? ich hoffe, die Erklärung ist nicht komplizierter als die Aufgabe geworden !!!
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 4 von piano
Nachtrag:
Deine Lösung klingt gut, bringt aber alle Läuferinnen, die in irgendeinem RTL gepunktet haben!
Deine Lösung klingt gut, bringt aber alle Läuferinnen, die in irgendeinem RTL gepunktet haben!

