Announcement

Collapse
No announcement yet.

Abfrage über 3 Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfrage über 3 Tabellen

    Hallo,
    ich bin auf der Suche nach einer Select-Abfrage für den folgenden Beispiel-Fall mit den 3 Tabellen:
    Code:
    Tier               Futter                 Zuordnung
    -----------------  ---------------------  -----------------
    |TierNr|TierName|  |FutterNr|FutterName|  |TierNr|FutterNr|
    |---------------|  |--------|----------|  |------|--------|
    | 1    |Affe    |  | 1      |Apfel     |  | 1    |  2     |
    | 2    |Giraffe |  | 2      |Banane    |  | 1    |  1     |
    | 3    |Biber   |  | 3      |Bambus    |  | 1    |  7     |
    | 4    |Pferd   |  | 4      |Rinde     |  | 2    |  5     |
    | 5    |Zebra   |  | 5      |Hafer     |  | 2    |  6     |
                       | 6      |Gras      |  | 3    |  4     |
                                              | 3    |  3     |
                                              | 4    |  5     |
                                              | 5    |  5     |
                                              | 5    |  6     |
    Aus der Tabelle Tier möchte ich nur die TierNamen haben, die sowohl Hafer als auch Gras fressen.
    Es sollten also nur Zebra und Giraffe in der Lösungsmenge vorkommen. Das Pferd frißt nur Hafer, darf also nicht gelistet sein.

    Könnt Ihr mir weiterhelfen?

    Mein Versuch mit der OR-Verknüpfung bringt leider nicht das gewünschte Ergebnis. Außerdem weiß ich nicht, wie ich den FutterNamen in die Abfrage bringen soll.
    Code:
    SELECT n.TierName FROM db.Tier n, db.Zuordnung z
    WHERE
    (((n.TierNr = z.TierNr) AND (z.FutterNr = 5  )) OR
     ((n.TierNr = z.TierNr) AND (z.FutterNr = 6  )))
    Apropos: Ich bin sicher, dass auch hier irgendwo eine Lösung im Verborgenen schlummert, die mein Problem genau beschreibt. Leider erfordert es extrem viel Zeit, diese Beiträge zu finden. Ich habe es nach Seite 30 aufgegeben... Das liegt auch daran, dass die Problembeschreibung meist in Textform erfolgt, was es schwer macht gleich zu erkennen, ob es das Problem trifft. Ich hoffe meine kleine Tabellenaufstellung beschleunigt das Verständnis

  • #2
    Hallo divNull, willkommen im Forum,

    sehr schön aufbereitet. Auch wenn ein Fehler drin ist denn in der Zuordnung wird FutterNr 7 verwendet und die gibt es in der Futter-Tabelle nicht .

    [highlight=sql]
    SELECT t.TierName
    FROM Zuordnung AS z
    JOIN Futter AS f
    ON f.FutterNr = z.FutterNr
    JOIN Tier AS t
    ON t.TierNr = z.TierNr
    WHERE f.FutterName IN ('Hafer', 'Gras')
    GROUP BY t.TierName
    HAVING COUNT(DISTINCT z.FutterNr) = 2
    [/highlight]

    die sowohl Hafer als auch Gras fressen.
    ...
    Ich bin sicher, dass auch hier irgendwo eine Lösung im Verborgenen schlummert
    So ist es: gib mal in die Suche "sql sowohl als auch" ein. Ich habs auch erst hinterher probiert aber da findest du die Lösung auch.



    mfG Gü
    Zuletzt editiert von gfoidl; 14.07.2011, 03:23.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo @gfoidl, richtig nette Begrüßung und vor allem eine Klasse-Lösung für das geschilderte Problem. Danke. Habe Deine Lösung gleich 'mal ein bißchen beschnuppert. Klappt soweit sehr gut.

      Das mit der "falschen 7" hat folgende Erklärung: Der Affe sollte zunächst noch 'ne Birne (=7) fressen. Da hab ich gesehen, dass der gute Kerl 5kg zu viel auf die Waage bringt und hab' ihm die Birne deshalb sofort wieder aus der Futtertabelle weggestrichen. Dumm nur dass das schlaue Tier schon was in der Zuordnung versteckt hatte. Genauso war's, ehrlich! Tja, mit den Viechern hat man so seine liebe Not!

      Vielen Dank noch mal.

      Comment

      Working...
      X