SQL Syntax "NOT IN" ???

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von 3daycliff.

    SQL Syntax "NOT IN" ???

    Hi!

    Kann mir jemand sagen, warum der Query
    SELECT UID FROM Bestellungen WHERE UID NOT IN (SELECT UID FROM Personen)
    nicht funktioniert?
    Das Ergebnis ist: Null Datensätze gefunden. Ansonsten keine Fehlermeldung.
    VB 2010, Access Datenbank, Feld UID hat in beiden Tabellen dieselben Eigenschaften, in Tabelle "Bestellungen" gibt es etwa 5x so viele Datensätze wie in "Personen". Ich möchte alle Datensätze aus "Bestellungen" deren UID in "Personen" NICHT vorkommt.
    JOIN wollte ich vermeiden, weil noch ein paar Verschachtelungen dazukommen.

    ErfinderDesRades schrieb:

    also bei einem konsistenten Datenmodell wäre gut möglich, dass das Ergebnis genau richtig ist: Nämlich, dass keine Bestellung existiert, die von keiner Person aufgegeben wurde.


    Um genau das zu kontrollieren brauch ich die Abfrage und im Vorfeld habe ich schon festgestellt, dass es einige Datensätzen gibt die gelistet werden müssten.

    3daycliff schrieb:

    Ich sehe da auch kein Problem mit deiner Query.
    Entweder hast du dich bei deinen Datensätzen, die gelistet werden müssten, verguckt oder du machst einen Fehler in deinem Programm (falsche DB, zusätzliche Where-Bedingungen etc.)
    Hast du mal die Query direkt in Access ausgeführt?


    Also ich hab jetzt die Query auch in Access probiert: Ebenfalls null Datensätze.
    Ich hab mir 2 UIDs mit "suchen" rausgepickt, die definitiv in "Bestellungen" da sind aber nicht in "Personen".
    Und zusätzliche Bedingungen hab ich derzeit auch nicht.
    Ich kapiers nicht und steh voll am Schlauch. ?(
    Mit "leer" meinst du sicher Null, oder? Falls ja erklärt das dein Problem.
    (Dachte UID sei sicher der PK (und lässt daher entsprechend keine Null-Values zu)...)

    Zur Logik: Ein "NOT IN" wird *in etwa* so ausgewertet: UID <> 3 AND UID <> 42 AND UID <> 4711 AND ....
    Ist nun beim Subselect ein Eintrag Null, hast du halt UID <> 3 AND UID <> NULL AND UID <> 42 AND .... Da Null nun mal kein Wert darstellt, schlägt der Vergleich natürlich auch fehl und der Ausdruck wird (immer) zu false ausgewertet.