Hello,
Ich denke ich habe da nen dicken Knoten im Kopf, wäre schön wenn mir da jemand beim lösen helfen könnte.
ja, diesen Knoten sollten wir lösen. Zur Verdeutlichung sei vielleicht auch nochmal unsere entsprechende Sammlung an SELFHTML-Artikeln empfohlen.
Bitte führe dir vor Augen, was die ON-Klausel festlegt: sie bestimmt, wann zwei Datensätze innerhalb eines Joins als zusammen gehörend angesehen werden. Sie bewerten also NICHT das Ergebnis, sondern ob die Sätze zusammen passen. Dies kombiniert mit einem LEFT JOIN hat gewaltige Auswirkungen. Der Left Join garantiert, dass jeder Datensatz aus der linken Tabelle im Ergebnis auftaucht, lässt aber viel Spielraum was mit der "rechten Hälfte" ist. Diese kann leer sein (keine Übereinstimmung gem. ON) oder befüllt sein (Übereinstimmung bei ON). Je nach Wahl der Klausel hat dies nun folgende Auswirkung:
Tabelle 1 Tabelle 2
1 A A #
2 B D *
3 C E -
Ein Left Join mit Gleichheit als Kriterium liefert
1 A A #
2 B
3 C
--> alle Sätze aus Tabelle 1, und nur der A Satz ergänzt um eine rechte Hälfte, bei B und C gibt es keine Übereinstimmung.
Ein Left Join mit Ungleichheit als Kriterium liefert ungleich was anderes:
1 A D *
1 A E -
2 B A #
2 B D *
2 B E -
3 C A #
3 C D *
3 C E -
--> beachte, dass du hier ALLES bekommen hast AUßER dem übereinstimmenden Satz A=A.
Du suchst schon prinzipiell die erste Variante mit Gleichheit, aber deine WHERE-Kriterien sind nicht angemessen. Du suchst nämlich solche Sätze, für die es entweder gar keinen Lehrer gibt ("rechte Hälfte" IS NULL) oder die zugeordneten Lehrer keine besondere Funktion haben:
SELECT nt_schulen.schulnr
FROM nt_schulen LEFT JOIN members
ON nt_schulen.schulnr == members.schulnr
WHERE
(members.schulnr IS NULL) -- hier gab es keine Übereinstimmun
AND (members.besonderefunktion IS NULL OR members.besonderefunktion <> 'Ja') -- hier gab es einen Lehrer, aber er hat entweder keine Sonderfunktion oder es steht was anderes als Ja drin)
Als Verfeinerung könnte man nun dafür sorgen, dass jede Nummer nur einmal ausgegeben wird:
SELECT DISTINCT nt_schulen.schulnr
FROM nt_schulen LEFT JOIN members
ON nt_schulen.schulnr == members.schulnr
WHERE
(members.schulnr IS NULL) -- hier gab es keine Übereinstimmun
AND (members.besonderefunktion IS NULL OR members.besonderefunktion <> 'Ja') -- hier gab es einen Lehrer, aber er hat entweder keine Sonderfunktion oder es steht was anderes als Ja drin)
...und bei genauerem Hinsehen stammen sowohl members.schulnr als auch members.besonderefunktion aus einer Tabelle, so dass wir dies im Hinblick auf den Join auch noch zusammenfassen können.
SELECT DISTINCT nt_schulen.schulnr
FROM nt_schulen LEFT JOIN members
ON nt_schulen.schulnr == members.schulnr
WHERE
members.besonderefunktion IS NULL OR members.besonderefunktion <> 'Ja'
MfG
Rouven
-------------------
sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
Because good guys need a break every once in a while. -- Morty in "Click" (Columbia Pictures, 2006)