sql abfrage *verzweiflung*

  • hallo!
    ich hab ein riesenproblem: ich bin grad am lernen für eine prüfung und hab da eine sql-abfrage, die ich nicht hinbekomme *buhuuuu*

    vielleicht kann mir jemand von euch helfen *hoff*

    also:
    es gibt 3 tabellen:
    buch (titel, seitenzahl, preis, verlag, genre)
    person (name, alter_p, adresse)
    autor (titel, name, honorar)

    autor.titel -> buch.titel, autor.name -> person.name
    genre IN {'Krimi', 'Fachliteratur', 'Comic'}

    ok und jetzt die aufgabe:
    ermitteln Sie alle Autoren (name), die für jeden gestellten honorarbetrag (zb 100) immer nur genau 1 Publikation geschrieben haben.

    ich check das irgendwie nicht :(((

    vielen dank schon mal!!!!

    greetz

    Legenden sterben nicht im Bett.
    Es gibt immer was zu tun.

  • Zitat von Usher

    select a.name
    from autor a
    group by a.name, a.honorar
    having count(a.titel) = 1

    Keine Garantie auf Richtigkeit.


    danke mal für die schnelle antwort :)
    eine frage: ich habe in meinen unterlagen stehen, dass group bei nur nach attributen gemacht werden darf, die auch selektiert wurden - heißt das nicht, dass ich a.honorar nicht zu group by geben dürfte?

    naja - vielleicht muss ich einfach noch ein bisserl mehr aufwachen - zZ hab ich nur einen knoten im hirn :)

    danke jedenfalls!

    greetz

    Legenden sterben nicht im Bett.
    Es gibt immer was zu tun.

  • Zitat von uli

    danke mal für die schnelle antwort :)
    eine frage: ich habe in meinen unterlagen stehen, dass group bei nur nach attributen gemacht werden darf, die auch selektiert wurden - heißt das nicht, dass ich a.honorar nicht zu group by geben dürfte?

    naja - vielleicht muss ich einfach noch ein bisserl mehr aufwachen - zZ hab ich nur einen knoten im hirn :)

    danke jedenfalls!

    greetz

    bei näherer betrachtung scheint es auch (zumindest für mich) als logisch, dass man nach nix groupieren kann, das nicht selektiert wurde - oder liege ich da kommlett falsch???

    danke!

    greetz

    Legenden sterben nicht im Bett.
    Es gibt immer was zu tun.

  • Hmm... also ich bin mir da nicht so sicher, aber ich denk das hängt auch vom Datenbanksystem ab! Aber ich denk da könnte was dran sein, mein postgresql lässt solche abfragen nicht zu mit dem Fehler:
    [font=arial,helvetican,sans-serif]ERROR: Attribute movie.mov_name must be GROUPed or used in an aggregate function
     [/font]
    Aber auf der mach ich normalerweise auch ein SELECT * ;) was bei der größe deiner Tables ja auch kein problem sein dürfte =)

  • In Oracle funktioniert so eine Abfrage, in der der Select-Ausdruck weniger Spalten umfasst, als der group-by Ausdruck. Aber das ist schon möglich, dass so eine "Regel" existiert...
    Um sicher zu gehen, kann man das ganze einbetten:

    select q.name
    FROM
    (SELECT a.name, a.honorar
    FROM autor a
    group by a.name, a.honorar
    having count(a.titel) = 1) q

  • 100000000 dank!!!!! ihr seid echt der helle wahnsinn :)

    dürft ich noch eine frage stellen? :engel:

    und zwar ist es das gleiche relationenschema wie oben:

    nur diesmal wollen sie für jeden Verlang die ältesten Autoren (name), die Krimis geschrieben haben. (soweit so gut :)) ABER wenn einige dieser Autoren zusätzlich noch Fachliteratur publiziert haben, dann ist deren Ausgabe nicht erwünscht.

    ich hab da noch eine frage: hab mir irgendwie überlegt, dass ich zuerst die abfrage mache, dass den ältesten autor jedes verlags ausgeben und dann mit EXCEPT die autoren wieder "rausstreichen" lasse, die fachliteratur geschrieben haben. müssen die attribute der zwei selects genau gleich sein, wenn ich ein EXCEPT mache?

    danke euch allen :))

    Legenden sterben nicht im Bett.
    Es gibt immer was zu tun.

  • wolt nur kurz bemerken - jetzt, da ich meinen knoten entfernt haben *gg* - dass die abfrage leider nicht korrekt ist :( die ist leider schon syntaktisch falsch :(
    es gibt keine query wie select .. from (subquery..)

    danke trotzdem :)
    greetz ulli

    Legenden sterben nicht im Bett.
    Es gibt immer was zu tun.


  • ich weiß nicht ganz was du mit "z.b. 100" meinst...

    aber meiner meinung nach müsste das so gehen:

    SELECT autor.name FROM autor,buch WHERE count(autor.titel)=1 and buch.titel = autor.titel ORDER BY name;

    hast du auch daten für diese tabelle? dann ist es einbisschen leichter das nachzuvolLziehen

    90% aller Fehler sitzen 60 cm vor dem Bildschirm

  • hallo!
    ja - hab tabellen:
    autor:
    titel name honorar
    1 ulli 100
    2 hugo 50
    2 jurgen 100
    2 peter 250
    3 sarah 28
    4 traudi 20
    4 ulli 40
    5 chris 0
    6 chris 100
    6 sarah 100
    6 traudi 100
    6 ulli 40
    7 jurgen 600
    8 peter 10
    9 lilly 50

    buch:
    titel seitenzahl preis verlag genre
    1 100 50 abc k
    2 550 100 abc f
    3 128 28 def c
    4 222 60 ghi f
    5 149 148 ghi k
    6 111 222 ghi f
    7 333 111 jkl f
    8 55 10 mno c

    mit "100" ist gemeint, dass ein autor verschiedene honorarnoten für verschiedene bücher stellen kann - dh er bekommt nicht für jedes buch gleich viel (also zb 100) sondern mal 100, dann verlangt er nur 90 etc ...
    rauskommen sollten dann bis auf ulli alle (soweit ichdas jetzt sehe *gg*) ulli hat als einzige 2 mal das gleiche honorar für versch. bücher bekommen ...
    ps: ich hoffe, es geht so zu lesen :)

    Legenden sterben nicht im Bett.
    Es gibt immer was zu tun.

  • so - jetzt hab ich's (mein gott jetzt hat sie's, mein gott jetzt hat sie's):

    SELECT autor.name, autor.honorar
    FROM autor,buch
    WHERE buch.titel = autor.titel
    GROUP BY autor.name, autor.honorar
    HAVING count(autor.honorar)=1;

    oder so gehts auch: (sogar mit einem distinct *gg*)
    SELECT DISTINCT name
    FROM autor
    WHERE name NOT IN
    (SELECT name
    FROM autor
    GROUP BY name, honorar
    HAVING COUNT (*) > 1);

    riesen danke an inspector gadjet - ohne dich hätt ich es nicht geschafft :)

    danke!
    greetz
    ulli

    Legenden sterben nicht im Bett.
    Es gibt immer was zu tun.

  • Zitat von uli


    riesen danke an inspector gadjet - ohne dich hätt ich es nicht geschafft :)

    bitte bitte, war zwar nicht ganz richtig, hab mich da eh auch vertan mit group und order... aber zum glück hab ich dich in die richtige richtung gewiesen...

    90% aller Fehler sitzen 60 cm vor dem Bildschirm

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!