Heim > Datenbank > MySQL-Tutorial > Warum gibt meine SQL-Abfrage „NOT IN' unerwartete Ergebnisse zurück?

Warum gibt meine SQL-Abfrage „NOT IN' unerwartete Ergebnisse zurück?

Mary-Kate Olsen
Freigeben: 2025-01-18 11:41:17
Original
778 Leute haben es durchsucht

Why Does My SQL `NOT IN` Query Return Unexpected Results?

SQL NOT IN Operatoren: Erwartet vs. tatsächlich

Der NOT IN-Operator in SQL stellt oft vor Herausforderungen. In diesem Artikel wird ein Szenario untersucht, in dem die NOT IN erwartete Funktionalität scheinbar fehlschlägt, das Problem analysiert und Alternativen bereitgestellt werden.

Angenommen, es gibt zwei Datenbanken, eine mit dem Hauptinventar und die andere mit einer Teilmenge dieser Datensätze. Eine Abfrage mit NOT IN versucht, die Unterschiede zwischen diesen beiden Datenbanken zu finden:

<code class="language-sql">SELECT  stock.IdStock
        ,stock.Descr       
FROM    [Inventory].[dbo].[Stock] stock
WHERE   stock.IdStock NOT IN
        (SELECT foreignStockId FROM
         [Subset].[dbo].[Products])</code>
Nach dem Login kopieren

Diese Abfrage lieferte jedoch nicht die erwarteten Ergebnisse. Es werden alle Datensätze ausgeschlossen, auch wenn sie in der Teildatenbank vorhanden sind. Der Mangel an Daten wirft die Frage auf: „Was ist schief gelaufen?“

Die Antwort liegt in der Möglichkeit von NULL-Werten in der Teilmengendatenbank. Wenn ein NULL-Wert gefunden wird, wird die

-Abfrage als NULL ausgewertet, wodurch diese Datensätze ausgeschlossen werden. Dieses Verhalten ist auf die von SQL verwendete dreiwertige Logik zurückzuführen, bei der Prädikate „Wahr“, „Falsch“ oder „Unbekannt“ zurückgeben können. NOT IN

Um dieses Problem zu beheben, können zwei Alternativen in Betracht gezogen werden:

Verwenden Sie : IS NOT NULL

<code class="language-sql">SELECT stock.IdStock,
       stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL)</code>
Nach dem Login kopieren

Verwenden Sie anstelle von NOT EXISTS: NOT IN

<code class="language-sql">SELECT stock.idstock,
       stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock)</code>
Nach dem Login kopieren
Beide Methoden verarbeiten NULL-Werte effizient und stellen sicher, dass nur gültige Vergleiche durchgeführt werden. Der letztere Ansatz mit

bietet normalerweise eine bessere Leistung, indem er den Ausführungsplan vereinfacht. NOT EXISTS

Denken Sie daran, beim Umgang mit NULL-Werten in SQL immer die dreiwertige Logik zu berücksichtigen und geeignete Techniken zu verwenden, um unerwartete Ergebnisse zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum gibt meine SQL-Abfrage „NOT IN' unerwartete Ergebnisse zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage