Heim > Datenbank > MySQL-Tutorial > Warum funktioniert meine SQL-Klausel „NOT IN' nicht mit NULL-Werten?

Warum funktioniert meine SQL-Klausel „NOT IN' nicht mit NULL-Werten?

Susan Sarandon
Freigeben: 2025-01-18 11:21:09
Original
483 Leute haben es durchsucht

Why Doesn't My SQL `NOT IN` Clause Work with NULL Values?

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:

heraus
<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. 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>
Nach dem Login kopieren

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!

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