Heim > Datenbank > MySQL-Tutorial > Warum gibt meine SQL-Abfrage „NOT IN' keine Ergebnisse zurück, wenn in der Unterabfrage NULL-Werte vorhanden sind?

Warum gibt meine SQL-Abfrage „NOT IN' keine Ergebnisse zurück, wenn in der Unterabfrage NULL-Werte vorhanden sind?

Patricia Arquette
Freigeben: 2025-01-18 11:32:10
Original
824 Leute haben es durchsucht

Why Does My SQL `NOT IN` Query Return No Results When NULL Values Exist in the Subquery?

SQLs NOT IN-Klausel und das NULL-Wert-Problem

Der NOT IN-Operator in SQL dient dazu, Zeilen auszuwählen, in denen der Wert einer Spalte nicht innerhalb eines angegebenen Wertesatzes gefunden wird. Dieser Operator verhält sich jedoch unerwartet, wenn der Vergleichssatz NULL-Werte enthält. Dieser Artikel erklärt dieses Verhalten und bietet Lösungen.

Das Problem:

Stellen Sie sich ein Szenario vor, in dem Sie versuchen, Produkte in einer Datenbank (Inventory) zu finden, die in einer Teildatenbank (Subset) nicht vorhanden sind. Ein gängiger Ansatz mit NOT IN könnte so aussehen:

<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

Wenn die Unterabfrage (SELECT foreignStockId FROM [Subset].[dbo].[Products]) irgendwelche NULL-Werte zurückgibt, wird die gesamte NOT IN-Bedingung unbestimmt, was zu einem leeren Ergebnissatz führt – selbst wenn es IdStock-Werte in [Inventory].[dbo].[Stock] gibt, die nicht vorhanden in .[Subset].[dbo].[Products]

Warum das passiert:

SQL verwendet dreiwertige Logik:

, TRUE und FALSE. Beim Vergleich eines Werts mit UNKNOWN ist das Ergebnis immer NULL. UNKNOWN prüft im Wesentlichen, ob ein Wert NOT IN für FALSEalle Vergleiche ist. Da nicht UNKNOWN ist, führt jedes FALSE in der Ergebnismenge der Unterabfrage dazu, dass die gesamte NULL-Bedingung als leere Menge ausgewertet wird.NOT IN

Lösungen:

Um dieses Problem zu vermeiden, verwenden Sie eine der folgenden Methoden:

1. NULL-Werte explizit ausschließen: Ändern Sie die Unterabfrage, um -Werte herauszufiltern: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

2. Verwenden Sie :NOT EXISTS Dieser Ansatz wird aufgrund seiner Klarheit und Effizienz im Allgemeinen bevorzugt:

<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
Die

-Klausel prüft, ob NOT EXISTSkeine Zeilen in der Unterabfrage vorhanden sind, die der Bedingung entsprechen. Es verarbeitet -Werte korrekt, ohne dass ein expliziter Ausschluss erforderlich ist.NULL

Wenn Sie die Interaktion zwischen

-Werten und dem NULL-Operator verstehen, können Sie robustere und zuverlässigere SQL-Abfragen schreiben. Die NOT IN-Alternative ist oft die sauberere und effizientere Lösung, wenn es um potenzielle NOT EXISTS-Werte im Vergleichssatz geht.NULL

Das obige ist der detaillierte Inhalt vonWarum gibt meine SQL-Abfrage „NOT IN' keine Ergebnisse zurück, wenn in der Unterabfrage NULL-Werte vorhanden sind?. 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