Fehlerbehebung bei der NOT IN
-Klausel und den NULL-Werten von SQL
Dieser Artikel befasst sich mit einem häufigen Problem, das bei der Verwendung der NOT IN
-Klausel in SQL-Abfragen auftritt: unerwartet leere Ergebnismengen aufgrund von NULL-Werten. Das Szenario umfasst die Auswahl von Datensätzen aus der Tabelle Stock
(in der Datenbank Inventory
), die in der Tabelle Products
(in der Datenbank Subset
) nicht vorhanden sind.
Die NOT IN
-Klausel funktioniert nicht wie erwartet, wenn die foreignStockId
-Spalte in der Products
-Tabelle NULL-Werte enthält. Das Vorhandensein auch nur einer einzigen NULL im Ergebnissatz der NOT IN
-Unterabfrage führt dazu, dass die gesamte Abfrage keine Zeilen zurückgibt.
Lösungen:
Um dies zu korrigieren, müssen wir NULL-Werte explizit ausschließen. Es werden zwei wirksame Ansätze vorgestellt:
1. Mit IS NOT NULL
:
Dieser Ansatz filtert NULL-Werte aus der NOT IN
-Unterabfrage:
<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. Mit NOT EXISTS
:
Die NOT EXISTS
-Klausel bietet eine effizientere und oft klarere Alternative:
<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>
Das Problem verstehen: Dreiwertige Logik
SQL verwendet dreiwertige Logik: Wahr, Falsch und Unbekannt. Eine WHERE
-Klausel muss „True“ ergeben, damit eine Zeile in die Ergebnismenge aufgenommen wird. Das Problem entsteht, weil 'A' <> NULL
zu Unknown
ausgewertet wird. Wenn Unknown
in einem NOT IN
-Vergleich vorhanden ist, wird der gesamte Ausdruck zu Unknown
, was zu einer leeren Ergebnismenge führt.
Anschauliches Beispiel:
Bedenken Sie Folgendes:
Predicate | True | False | Unknown |
---|---|---|---|
'A' NOT IN ('X','Y',NULL) |
True | True | Unknown |
Das Unknown
Ergebnis ergibt sich aus dem Vergleich von „A“ mit NULL. Daher wird die gesamte WHERE
-Klausel als Unknown
ausgewertet und es werden keine Zeilen zurückgegeben.
Durch die Verwendung von IS NOT NULL
oder NOT EXISTS
umgehen wir diese Mehrdeutigkeit und stellen sicher, dass die Abfrage die beabsichtigten Ergebnisse zurückgibt. Der NOT EXISTS
-Ansatz wird aufgrund seiner verbesserten Leistung und Lesbarkeit in solchen Szenarien häufig bevorzugt.
Das obige ist der detaillierte Inhalt vonWarum funktioniert meine SQL-Klausel „NOT IN' nicht mit NULL-Werten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!