Heim >Datenbank >MySQL-Tutorial >Warum liefert meine SQL-Klausel „NOT IN' nicht die erwarteten Ergebnisse?

Warum liefert meine SQL-Klausel „NOT IN' nicht die erwarteten Ergebnisse?

Barbara Streisand
Barbara StreisandOriginal
2025-01-18 11:36:09466Durchsuche

Why Does My SQL `NOT IN` Clause Fail to Return Expected Results?

Fehlerbehebung in der NOT IN-Klausel von SQL: Warum es fehlschlagen könnte und wie man es behebt

Die SQL-NOT IN-Klausel dient dazu, Zeilen aus einer Tabelle auszuwählen, die in einer anderen nicht vorhanden sind. Insbesondere beim Umgang mit NULLWerten.

kann es jedoch zu unerwartetem Verhalten kommen

Lassen Sie uns diese problematische Abfrage analysieren:

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

Diese Abfrage gibt möglicherweise keine Ergebnisse zurück, selbst wenn sie bestimmte Datensätze ausschließen sollte.

Die Grundursache: NULLWerte

Das Problem ist auf NULL-Werte in der Spalte foreignStockId der Tabelle Products zurückzuführen. Der NOT IN-Operator von SQL verhält sich mit NULLs unvorhersehbar. Ein Vergleich mit NULL führt immer zu UNKNOWN, was sich wiederum auf die gesamte boolesche Logik der WHERE-Klausel auswirkt.

Effektive Lösungen:

Hier sind zwei zuverlässige Möglichkeiten, dies zu beheben:

  1. Herausfiltern von NULLs: Ändern Sie die Unterabfrage, um NULL-Werte:
  2. explizit auszuschließen
<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: Dieser Operator bietet eine robustere und oft effizientere 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>

NOT EXISTS prüft direkt, ob keine übereinstimmenden Zeilen vorhanden sind, und vermeidet so die Komplexität von NULL Vergleichen.

Leistungsoptimierung:

Obwohl beide Lösungen richtig sind, kann ihre Leistung variieren. NOT EXISTS führt im Allgemeinen zu einfacheren und möglicherweise schnelleren Ausführungsplänen, insbesondere bei großen Datensätzen. Wenn Ihre foreignStockId-Spalte jedoch keine NULL-Werte enthält, ist die Leistung von NOT IN möglicherweise etwas besser. Am besten testen Sie beide Ansätze in Ihrer spezifischen Umgebung, um die optimale Lösung zu ermitteln.

Das obige ist der detaillierte Inhalt vonWarum liefert meine SQL-Klausel „NOT IN' nicht die erwarteten Ergebnisse?. 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