Benutzer mit den meisten Antworten
SQL Server "not in" liefert falsches Ergebnis

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
Antworten
-
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- Als Antwort vorgeschlagen Elmar BoyeEditor Freitag, 11. November 2016 09:24
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 24. November 2016 11:43
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
- Bearbeitet Stefan FalzModerator Freitag, 11. November 2016 08:42
-
Hallo Stefan
Die shop.ids der fehlenden 5 Zeilen sind:
-8456614020716610556
-8456614020716608833
-8456613999098809746
-8456612890518471516
-8456612890518471355defaultshop ist entweder eine shopid oder NULL, wenn der Mitarbeiter keinen defaultshop hat
-
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- Als Antwort vorgeschlagen Elmar BoyeEditor Freitag, 11. November 2016 09:24
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 24. November 2016 11:43
-
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