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>
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 FALSE
alle 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>
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>
-Klausel prüft, ob NOT EXISTS
keine Zeilen in der Unterabfrage vorhanden sind, die der Bedingung entsprechen. Es verarbeitet -Werte korrekt, ohne dass ein expliziter Ausschluss erforderlich ist.NULL
-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!