PDA

View Full Version : [FRAGE] - SQL Beispiele 5,6,9,10


Zentor
10-05-2002, 13:55
Stimmen meine Lösungen?

5.) select Buch.Titel, Kunde.Knr, Kunde.Nachname, Ausleihe.von
from Buch, Kunde, Ausleihe
where Ausleihe.von not null and Ausleihe.bis = null

6.) select Buch.Titel, Kunde.Knr, Kunde.Nachname, Ausleihe.von
from Buch, Kunde, Ausleihe
where Ausleihe.von not null and Ausleihe.bis = null and Ausleihe.von < 2002
9.) select Nachname, Jahr
from Kunde
where Knr in ( select Knr
from Ausleihe
where InvNR in ( select InvNR
from Exemplar
where ISBN in ( select ISBN
from Klassifikation
where Gebiet = 'Mathematik'
)
)
)
10.) select Nachname, Vorname, KNr
from Kunde
where KNR not in (select Knr
from Ausleihe
where InvNR in ( select InvNR
from Exemplar
where ISBN in ( select ISBN
from Klassifikation
where Gebiet = 'Beletristik'
)
)
)


ich weis nicht ob man bei 5. soviel vermixen darf und ob da eine gültige Tabelle rauskommt. Muss man bei SQL zuerst nachprüfen ob ein wert nicht null ist und dann vergleichen weil sonst reicht in Bsp 6.
where Ausleihe.von <2002 and Ausleihe.bis = null

Zu Bsp 9 und 10 gibts doch sicher eine gescheitere Vorgehensweise als den ganzen Relationen folgend 3 Verschachtelungen zu begehen oder?

mfg Zentor

Zentor
10-05-2002, 18:00
bei 9,10 wäre eine Alternative vielleicht


9.) select k.Nachname, k.Jahr
from Kunde k,Ausleihe a, Exemplar e,Klassifikation k
where k.Knr = a.Knr and
a.InvNR = e.InvNR and
e.ISBN = k.ISBN and
k.Gebiet = 'Mathematik'

10.) select k.Nachname, k.Vorname, k.KNr
from Kunde k,Ausleihe a, Exemplar e,Klassifikation k
where k.Knr = a.Knr and
a.InvNR = e.InvNR and
e.ISBN = k.ISBN and
k.Gebiet not 'Beletristik'


aber da ist wieder so ein großes karthesisches Produkt, is die Variante richtig/günstig?
mfg Zentor

tocvolxa
10-05-2002, 19:30
hi!

also wenn ich das verstanden habe,
muss man einen natural join immer extra anschreiben,
sonst wird das kartesische produkt gebildet.

Muss man bei SQL zuerst nachprüfen ob ein wert nicht null ist und dann vergleichen weil sonst reicht in Bsp 6.
where Ausleihe.von <2002 and Ausleihe.bis = null
das auf null überprüfen is nicht notwendig
(buch s 88: "... ein vergleich mit einem nullwert hätte immer false ergeben")

bei bsp 6 wäre meine lösung

select Buch.Titel, Kunde.Knr, Kunde.Nachname, Ausleihe.von
from Buch, Exemplar, Kunde, Ausleihe
where Ausleihe.InvNr = Exemplar.InvNr and
Exemplar.ISBN = Buch.ISBN and
Kunde.KNr = Ausleihe.KNr and
Ausleihe.bis not null and
Ausleihe.von < 2002


bin mir auch nicht sicher ob das stimmt.
aber ich denke dass man die relation exemplar
dazunehmen müsste, oder?

Zentor
10-05-2002, 23:04
Heisst das nun die erste Variante oder die 2. is besser?:confused: Also deine Lösung zu 6. sieht schon wesentlich einleuchtender aus als mein Durcheinander.
mfg Zentor

LordOfTheBite
11-05-2002, 04:04
ein vergleich mit null ergibt immer false, aber man muss in diesem fall feststellen ob ein wert = null ist

das geht so:

Ausleihe.bis is null

tocvolxa
12-05-2002, 12:42
Original geschrieben von Zentor
Heisst das nun die erste Variante oder die 2. is besser?:confused:

welche version professioneller oder gschickter is, weiß ich auch nicht.
aber imho fehlt bei der zweiten version von 9
ein abschließendes "group by"
sonst werden leute die sich mehrmals mathebücer geliehen
haben ja oft aufgelistet.

mfg, tocvolxa

ach ja, und das "Mathematik" muss ma für die dmlu-datenbank klein schreiben, sonst funzt nix :D

LordOfTheBite
12-05-2002, 12:51
@zentor bsp 10:

ich glaube du versäumst durch deine query die leute, die noch nie ein buch ausgeliehen haben (und folglich auch noch nie ein belletristisches buch ausgeliehen haben)

außerdem fehlen die group by's, sonst kommen ja die kunden pro buch das sie ausgeliehen haben ins ergebnis

meine lösung sieht so aus:

bsp 10:

select
k.Nachname, k.Jahr
from
Kunde k
where
k.KNr not in (
select
distinct a.KNr
from
Ausleihe a, Exemplar e
where
a.InvNr = e.InvNr and e.ISBN in (
select k.ISBN
from Klassifikation k
where k.Gebiet = 'Belletristik'
)
);

Zentor
12-05-2002, 13:03
Ok, ich hab schon beim Absetzten der Querys im Webinterface dauernd die Mitteilung bekommen das "group by" fehlt aber was bewirkt das genau? Zu 10 is deine Lösung sicher besser.
mfg Zentor