Heim >Datenbank >MySQL-Tutorial >Warum schlagen meine SQL-Abfragen „NOT IN' fehl, wenn NULL-Werte vorhanden sind?

Warum schlagen meine SQL-Abfragen „NOT IN' fehl, wenn NULL-Werte vorhanden sind?

DDD
DDDOriginal
2025-01-18 11:26:12819Durchsuche

Why Do My SQL `NOT IN` Queries Fail When NULL Values Are Present?

Fehlerbehebung NOT INAbfragen 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]:

vorhanden sind
<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:

  1. NULL-Werte aus der Unterabfrage filtern: Ändern Sie die Unterabfrage, um NULL-Werte auszuschließen, indem Sie IS NOT NULL:
  2. verwenden
<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>
  1. Verwendung von 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!

Stellungnahme:
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