Heim >Datenbank >MySQL-Tutorial >Warum schlagen meine SQL-Abfragen „NOT IN' fehl, wenn NULL-Werte vorhanden sind?
Fehlerbehebung NOT IN
Abfragen und NULL-Werte
Wenn Sie eine Datenbank abfragen, um Datensätze zu finden, die in einer Teilmenge fehlen, kann die Verwendung von NOT IN
zu unerwarteten leeren Ergebnissen führen. Dies tritt häufig auf, wenn die Unterabfrage NULL-Werte enthält.
Das Problem: NOT IN
und NULL-Werte
Betrachten Sie diese SQL-Abfrage zum Abrufen von Datensätzen aus [Inventory].[dbo].[Stock]
, die nicht in [Subset].[dbo].[Products]
:
<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 foreignStockId
NULL-Werte enthält, gibt diese Abfrage möglicherweise keine Zeilen zurück, selbst wenn Übereinstimmungen vorhanden sind. Dies liegt an der dreiwertigen Logik von SQL. Ein Vergleich mit NULL führt zu UNKNOWN
, was sich auf die NOT IN
-Auswertung auswirkt.
Die Lösung: Umgang mit NULL-Werten
Zwei wirksame Lösungen vermeiden dieses Problem:
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>
NOT EXISTS
: Ersetzen Sie NOT IN
durch NOT EXISTS
für einen potenziell effizienteren und klareren Ansatz:<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>
Leistung:
NOT EXISTS
führt oft zu einfacheren Ausführungsplänen, was möglicherweise zu einer besseren Leistung führt, insbesondere beim Umgang mit NULL-Werten.
Weiterführende Literatur:
Ausführlichere Vergleiche verschiedener Ansätze für dieses Problem, einschließlich LEFT JOIN
und anderer Alternativen, finden Sie in diesen Ressourcen:
Das obige ist der detaillierte Inhalt vonWarum schlagen meine SQL-Abfragen „NOT IN' fehl, wenn NULL-Werte vorhanden sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!