none
SQL Server "not in" liefert falsches Ergebnis RRS feed

  • Frage

  • Hallo zusammen

    Kann mir jemand erklären, wie es möglich ist, dass folgende 2 Abfragen nicht das gleiche Ergebnis liefern?

    select * from shop --> Liefert 206 Zeile


    select * from shop where shop.id not in (select defaultshop from mbv)  -->Liefert 201 Zeilen
    union 
    select * from shop where shop.id in (select defaultshop from mbv)  --> Liefert 0 Zeilen 

    --> Liefert 201 Zeilen

    Der zweite Teil des union, welcher 0 Zeilen liefert sollte eigentlich die restlichen 5 liefern. Habe dies sogar händisch kontrolliert und da komme ich auf die 5 Zeilen.

    Habe also keine Ahnung, war der SQL-Server da anderer Meinung ist.

    Hoffentlich kann mir wer von euch da weiterhelfen.

    Danke

    Lg

    Christian

    Freitag, 11. November 2016 08:20

Antworten

Alle Antworten

  • Hallo Christian,

    ohne zu wissen, welche Daten in den fehlenden 5 Zeilen stehen (insbesondere in shop.id und defaultshop) kann man nur raten.

    Ist die Spalte "shop.id" in den fehlenden Zeilen evtl. mit NULL Werten belegt?

    Doppelte Datensätze könnten durch UNION auch nicht angezeigt werden aber das scheint ja lt. dir nicht das Problem sein zu können.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 11. November 2016 08:39
    Moderator
  • Hallo Stefan

    Die shop.ids der fehlenden 5 Zeilen sind:

    -8456614020716610556
    -8456614020716608833
    -8456613999098809746
    -8456612890518471516
    -8456612890518471355

    defaultshop ist entweder eine shopid oder NULL, wenn der Mitarbeiter keinen defaultshop hat

    Freitag, 11. November 2016 08:45
  • Hi,

    in dem Fall würde ich mal sagen, dass NULL das Problem ist.

    SELECT ISNULL( defaultshop, 0 ) FROM mbv

    sollte das Problem evtl. lösen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 11. November 2016 09:00
    Moderator
  • Hi

    Danke für deine Lösung.

    Hat funktioniert.

    Mir ist zwar noch nicht klar warum der SQL-Server ein Problem mit NULL bei NOT IN hat aber was solls.

    Danke

    Lg

    Freitag, 11. November 2016 09:02
  • Hallo,

    nicht der SQL Server hat ein Problem mit NULLen, sondern Du mit Deinem Verständnis wie eine NULL behandelt wird. Bei IS NOT (NULL) gelten die Regeln der dreiwertigen Logik (siehe auch NULL (SQL)): NULL ist nicht einmal mit sich selbst gleich zu setzen, das Ergebnis ist UNKNOWN.

    Stefans ISNULL Lösung macht daraus quasi eine zweitwertige Logik, alternativ kann man alle Werte ausschließen, die NULL sind:

    SELECT defaultshop FROM mbv WHERE defaultshop IS NOT NULL

    Gruß Elmar

    Freitag, 11. November 2016 09:24
    Beantworter