Abfrage aus einer n:m Relation

gliese_518c

Neuer Benutzer
Beiträge
4
Hallo liebe SQL Spezies :)

ich dreh mich gerade im Kreis bei einer eigendlich recht einfachen Abfrage

auf 2 Tabellen (tab1 + tab2) die in einer n:m Relation stehen.

Nun möchte ich das mir alle Werte aus tab1 gegeben werden

die nicht in der tab3 mit dem Wert 2 (Fleisch) vorkommen..

tab1

_________

| id | titel |

------------

| 1 | Hase |

-------------

| 2 | Katze |

-------------

| 3 | Maus |

-------------

| 4 | Schwein |

-------------

tab2

_____________

| id | Nahrung |

-------------------

| 1 | Gemüse |

-------------------

| 2 | Fleisch |

---------------------

hier die Relation

tab1_eats_tab2

________________

| tab1_id | tab2_id |

-----------------------

| 1 | 1 |

----------------------

| 2 | 1 |

---------------------

| 3 | 2 |

---------------------

| 4 | 1 |

---------------------

| 4 | 2 |

---------------------

folgendes habe ich versucht aber das ist falsch:

SELECT tab1.title
FROM tab1
LEFT JOIN tab1_eats_tab2
ON tab1.id = tab1_eats_tab2.tab1_id
WHERE tab1_eats_tab2.tab2_id !=2

Was mache ich falsch?

vielen Dank im Voraus!!

gruss

Stefan
 
Werbung:
In MSSQL ist die Syntax richtig, in MySQL vermutlich auch. Eventuell hast du title mit titel verwechselt?

Ansonsten versuch mal das hier:
Code:
SELECT    tab1.titel
FROM    tab1,
        tab2,
        tab1_eats_tab2
WHERE    tab1.id = tab1_eats_tab2.tab1_id
AND        tab2.id = tab1_eats_tab2.tab2_id
AND        tab2.Nahrung != 'Fleisch'
 
hallo ukulele
vielen Dank für DeineAntwort!
Ja, stimmt, die Syntax ist richtig.
Ich merke gerade das ich das in meinem ersten Beitrag nicht
eindeutig beschrieben habe... Entschuldige bitte!
Das Ergebniss der Abfrage soll so sein
das nur die 'reinen' Gemüsefresser ausgegeben werden
also ohne das Schwein....

Wenn ich zB. folgendes probiere (hab die Tabellennamen
zur besseren Lesbarkeit mal angepasst):

Code:
SELECT t.title FROM tiere t
WHERE t.id =(SELECT tiere_id FROM
tier_isst_futter tf WHERE futter_id != 2)
dann kommt der Fehler:

Code:
#1242 - Subquery returns more than 1 row

Ich hoffe ich konnte mein Problem halbwegs verständlich
beschreiben....

viele Grüße
Stefan
 
Den Fehler behebst du, in dem du statt "= ( SELECT" ein "IN ( SELECT" verwendest. Damit kannst du gegen mehrere Werte prüfen.
 
... Super das funktioniert... aber es wird immer noch 'Schwein' mit ausgegeben..
Geht das überhaupt das ich nur die ohne Fleisch als Ergebniss bekomme?

Code:
SELECT t.title
FROM tiere t
WHERE t.id
IN (

SELECT tiere_id
FROM tier_isst_futter tf
WHERE futter_id !=2
 
Eventuell so:
Code:
SELECT    tab1.titel
FROM    tab1
WHERE    tab1.id NOT IN (    SELECT    tab1_eats_tab2.tab1_id
                            FROM    tab1_eats_tab2
                            WHERE    tab1_eats_tab2.tab2_id IN (    SELECT    tab2.id
                                                                FROM    tab2
                                                                WHERE    tab2.Nahrung = 'Fleisch' ) )

Hab das jetzt aber nicht getestet. Generell geht das, es gibt ja auch noch verschiedene andere JOINS. Ich persönlisch schachtel eigentlich lieber SELECTs ineinander, da blick ich nachher besser durch. Du kannst auf jedenfall mit NOT IN oder NOT EXISTS arbeiten.
 
Werbung:
Zurück
Oben