Vinzenz Mai: OUTER JOIN: Join-Bedingung und WHERE-Klausel

Beitrag lesen

Hallo,

Jetzt möchte ich alle Schulen finden denen noch kein Lehrer mit einer besonderen Funktion an der Schule ( Feld:besonderefunktion) zugeordnet sind.

Mein Query sieht so aus:
SELECT nt_schulen.schulnr FROM nt_schulen LEFT JOIN members ON nt_schulen.schulnr != members.schulnr WHERE members.besonderefunktion = 'Ja'

bei diesem Query erhalte ich aber ein sehr viel größeres Resultat alsdas es Schulen (6702) geben würde.

das ist klar. Die meisten Lehrer, die ich kenne, lehren an genau einer einzigen Schule, ein paar an zwei verschiedenen. Sie sind *nicht* Lehrer an 25 anderen Schulen. Wenn nun ein solcher Lehrer eine Spezialfunktion hat und Du 27 Schulen hast, dann taucht er in 26 (bzw. 25) Datensätzen auf.

Warum erhalte ich bei != nicht das richtige Ergebniss, es sollte mir nach meiner Logik doch alle Schulen liefern die noch keinen Lehrer zugeordnet haben, wenn = mir alle Schulen liefert an denen Lehrer zugeordnet sind.

Oh nein. != ist *nicht* das was Du suchst. Du benötigst NULL-Werte und Deine WHERE-Bedingung ist ebenfalls falsch. Diese Bedingung gehört ebenfalls in die JOIN-Bedingung, siehe dazu diesen Archivbeitrag von mir.

[code lang=sql]
SELECT                              -- Gib mir
    s.schulnr                       -- alle ids der Schulen
FROM                                -- aus der Tabelle
    nt_schulen s                    -- nt_schulen, angesprochen über den
                                    -- Aliasnamen s (wie Schulen)
LEFT JOIN                           -- die mit der Tabelle
    members l                       -- members (angesprochen als l wie Lehrer)
ON                                  -- über die Bedingung gleicher
    s.schulnr = l.schulnr           -- Schulnummern
AND                                 -- und der Existenz
    l.besonderefunktion = 'Ja'      -- einer besonderen Funktion,
WHERE                               -- wobei wir nur an den Schulen
    l.schulnr IS NULL               -- interessiert sind, die keinen solchen
                                    -- aufweisen.

Alternativ ginge es auch mit einem Subselect.

Freundliche Grüße

Vinzenz