Könnt ihr mir helfen: Was ist da falsch??? (Bsp.20)

  • Hoi Leute, wär toll wenn ihr mir sagen könntet was da nicht stimmt, ich bekomm immer gar nichts raus bei der Query ...


    Bsp.20)


    select k.telefon, k.nachname, k.vorname from kunde k where k.knr = ausleihe.knr and
    ausleihe.invnr = exemplar.invnr and
    exemplar.isbn = autor.isbn and
    autor.vorname = 'karl' and
    autor.nachname = 'may'
    group by k.telefon, k.nachname, k.vorname
    having
    count(distinct exemplar.isbn) =
    ( select count (buch.isbn) from buch, autor where buch.isbn=autor.isbn and autor.vorname='karl' and autor.nachname='may');


    Bis zum subselect ist alles gleich wie bei der musterlösung, aber der subselect muss doch auch stimmen, ich verstehs nicht.
    Ich zähl im subselect einfach alle verschiedenen ISBN's die's gibt von dem Autor Karl May.


    Wo liegt der blöde Fehler???? Sehr dankbar für Tipp!

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Gehört da nicht noch ein Group by hin???? Wenn du Count verwendest musst du auch nach was Gruppieren oder?


    -> Count(buch.isbn)...... -> hinten group by (wasweissichirgendwas)


    vielleicht liegts daran aber ich test jetz mal das statement durch, mal sehen.

  • du musst die ISBNs im sub-query auch "distinct" counten, sonst kommt dir bei dem count viel mehr raus, als es eigentlich verschiedene Karl May Bücher gibt, weshalb der Vergleich immer false sein wird und du daher überhaupt keine Tupel ausgewählt bekommst... also


    having
    count(distinct exemplar.isbn) =
    ( select count (distinct buch.isbn) from buch, autor where buch.isbn=autor.isbn and autor.vorname='karl' and autor.nachname='may');


    Außerdem gehören in das "from" vom äußeren Query ALLE Tabellen, die du verwendest, also auch Ausleihe, Autor und Exemplar!

  • Zitat

    du musst die ISBNs im sub-query auch "distinct" counten


    Hmm ich hab gedacht ich brauch hier kein distinct, weil die ISBN's der Bücher ja primary keys sind und deswegen nur einmal vorkommen. Ich habs aber auch mal mit distinct versucht, mit demselben Ergebniss.




    Zitat

    Außerdem gehören in das "from" vom äußeren Query ALLE Tabellen, die du verwendest, also auch Ausleihe, Autor und Exemplar!


    Brauch ich die ALLE? Ich will die Ergebniss-Tupel doch nur von Kunde haben... Bei den anderen Bsp hab ich die anderen Relationen zumindest auch immer weglassen können. Ich dachte wiederum die werden nur angeschrieben, um Abkürzungen zu generieren (also das ich z.B. nicht immer exemplar.invnr sondern e.invnr schreiben kann)


    Leider kann ich ja nicht mit der Datenbank rumprobieren :(

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Zitat

    Original geschrieben von AntiBit


    Brauch ich die ALLE?


    Also, laut SQL Standard musst du das schon, vielleicht ist PostgreSQL aber da nicht so streng.


    Mit den ISBNs vom Buch hast du allerdings recht, denke ich mal, also kanns daran nicht liegen, war mein Fehler!


    Was anderes: ist SQL bei den strings vielleicht case-senstive? Ich mein, beim Anfragecode nicht, aber vielleicht gilt bei den strings 'karl' != 'Karl', da bin ich mir aber nicht sicher.


    Außerdem tät ich dir vorschlagen, auf JEDENFALL bei einem Vergleich von zwei counts diesselben Attribute aus derselben Relation zu zählen, also nicht einmal ISBN vom Buch, einmal von Exemplar: was ist, wenn ein Karl May Buch in der Datenbank ist, von dem es kein Exemplar gibt -> das könnte auch keiner entlehnt haben! Nimm mal im inneren Query Exemplar statt Buch! Exemplar.ISBN musst du dann aber schon distinct counten!