PDA

View Full Version : [Frage] Bsp 4


Cha
11-05-2002, 16:44
Danke gst für deine Mühe das alles abzutippseln.

Ich hätte da aber eine Frage zum Bsp 4 -- Sollen da nicht alle Bücher ausgegeben werden und die, die keine Exemplar im Regal Nr 5 haben einen NULL-Wert enthalten? Oder hab ich das falsch verstanden?

Lg

gst
11-05-2002, 16:53
hmm.. ja,tnx - hab mich bei der angabe verlesen :/

LordOfTheBite
11-05-2002, 16:54
da es in der deutschen sprache manchmal vieldeutigkeiten gibt, wäre eine klammernsetzung in der angabe vielleicht hilfreich.

schreiben sie eine sql anfrage, welche (die titel aller bücher und die anzahl der jeweiligen exemplare) in regal nummer 5 berechnet

schreiben sie eine sql anfrage, welche (die titel aller bücher) und (die anzahl der jeweiligen exemplare in regal nummer 5) berechnet

also ich denke fall 1 ist sinnvoller, interpretieren kann man es natürllich auch als fall 2, wo man für alle bücher die nicht in regal 5 sind 0 ausgeben muss (NULL würde heißen man weiß nichts über das buch, 0 heißt man weiß es sind genau 0 davon im regal)

peter

gst
11-05-2002, 17:03
hmm... stimmt... nachdem ich mir die angabe noch ein 3. mal durchgelesen hab wuerd ich meine loesung doch wieder als richtig interpretieren ;)

naja... werd doch einmal die alte loesung vorerst so lassen...

Cha
11-05-2002, 17:22
Stimmt LordOfThe Bite --- vielleicht werde ich am Di nach der VO fragen, wie das jetzt genau gemeint ist.

Zentor
11-05-2002, 17:33
Aus reiner Neugier, wie würde die Anfrage für die 2.Formulierung aussehn?
mfg Zentor

LordOfTheBite
12-05-2002, 12:24
die anfrage für die 2. formulierung würde ich mittels einer union mit allen vorhandenen bücher-exemplaren machen, wo ich danach vom count 1 abziehe (so habe ich noch ein paar andere probleme gelöst)

würde so aussehen (ca):


select
u.titel, count(*)-1 as anzahl
from (
select
b.titel
from
buch b
natural join exemplar e
natural join ausleihe a
where
a.bis is null
and e.regalnr=5
union all
select
bb.titel
from
buch bb
natural join exemplar ee
where
ee.regalnr=5
) as u
group by u.titel;


macht spaß, oder ?

:D

edit: habs jetzt getestet, funktioniert auf der websql-datenbank (es kommt sogar ein nullwert, vorausgesetzt die haben meinen frisch inserteten datensatz noch nicht gekillt)

Zentor
12-05-2002, 13:24
uffff:eek: also das schaut nicht mehr trivial aus.
mfg Zentor

thita
16-05-2002, 13:19
Original geschrieben von LordOfTheBite
edit: habs jetzt getestet, funktioniert auf der websql-datenbank (es kommt sogar ein nullwert, vorausgesetzt die haben meinen frisch inserteten datensatz noch nicht gekillt)

jo, ich habs mit deinem code jetzt auch getestet, aber es werden ja trotzdem nicht alle bücher angezeigt!! es müssten 27-30 bücher sein, bei 7 sollte ein ergebnis herauskommen, bei den anderen 23 sollte 0 stehen.......bei deiner codierung sind es insgesamt nur 9 bücher......das kann ja gar nicht stimmen.....ODER?

LordOfTheBite
16-05-2002, 21:43
du hast recht, mein fehler

richtig ist


select
u.titel, count(*)-1 as anzahl
from (
select
b.titel
from
buch b
natural join exemplar e
natural join ausleihe a
where
a.bis is null
and e.regalnr=5
union all
select
distinct bb.titel
from
buch bb
) as u
group by u.titel;



man beachte das select nach dem union all -> ich hatte da noch ein where und ein join zuviel

peter

Geli
17-05-2002, 22:21
Also, ich versteh die Angabe so, dass wir die Bücher raussuchen sollen, die theoretisch im Regal stehen würden, wenn keines verliehen ist. (es steht ja, es wird nicht berücksichtigt, ob ein Buch ausgeliehen ist, also tun wir so, als wär es da). In dem Fall brauch ich ja aber die Relation Ausleihe gar nicht.

Ausschaun würd das bei mir dann so:


select distinct Titel, count (InvNr) as Anzahl
from Buch join Exemplar using (ISBN)
where RegalNr = 5
group by Titel


lg, Geli

LordOfTheBite
17-05-2002, 23:03
@geli: bitte schau, dass du zumindest einmal die query ausprobierst bevor du sie postest (die fehlermeldungen der websql.dbai.tuwien.ac.at datenbank sind doch hilfreich)

deine query hat folgende syntaktischen fehler:
ein subselect im from muss immer ein alias haben ->

select ... from (select ... from ...) AS ALIAS where ...

außerdem musst du wenn du countest andere felder die du ausgeben willst gruppieren ->

+ group by titel

außerdem hattest du folgenden denkfehler:
du willst ja die buchanzahl pro titel und nicht "1" für jeden titel,
also darfst du NICHT distinct counten:

die richtige query wäre:


select x.Titel, count (x.Titel)
from
(select *
from buch, Exemplar
where Buch.ISBN = Exemplar.ISBN
) as x
where x.RegalNr =5
group by x.titel


allerdings gehts auch einfacher:


select
b.titel, count(e.invnr)
from
buch b natural join exemplar e
where
e.regalnr=5
group by
b.titel

peter

Geli
17-05-2002, 23:34
@Lordofthebite

Ja, sorry, hab meine Fehler auch schon entdeckt, aber das mit dem alias hab ich irgendwie nicht verstanden.

habs dann eh so ähnlich gemacht wie du, allerdings funktioniert das sehr wohl auch mit distinct titel. Zumindest is das Ergebnis in der Datenbank richtig.

lg, Geli

sabs
24-05-2002, 15:18
wieso funzt diese query nicht? sie gibt nich die genaue anzahl der mehrfach vorhandenen bücher aus.

select Titel, count(Titel) as Anzahl from Buch
where ISBN in
(select ISBN from Exemplar where RegalNr = '5')
group by Titel

LordOfTheBite
24-05-2002, 16:50
weil du von buch selectest und da nur jedes buch und nicht jedes exemplar drinnen ist

du müsstest buch noch auf exemplar joinen, das ginge, ist aber imho nicht so wirklich sauber

peter

sabs
24-05-2002, 18:59
eigentlich eh logisch. hätte ich selber auch draufkommen können! aber irgendwie schwirren schon lauter bücher in meinem hirn rum uns sonst nichts mehr.