Heim >Datenbank >MySQL-Tutorial >Warum liefert meine SQL-Klausel „NOT IN' nicht die erwarteten Ergebnisse?
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 NULL
Werten.
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: NULL
Werte
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 NULL
s 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:
NULL
s: Ändern Sie die Unterabfrage, um NULL
-Werte:<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
: 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!