SQL NOT IN
Operatoren: Erwartet vs. tatsächlich
Der NOT IN
-Operator in SQL stellt oft vor Herausforderungen. In diesem Artikel wird ein Szenario untersucht, in dem die NOT IN
erwartete Funktionalität scheinbar fehlschlägt, das Problem analysiert und Alternativen bereitgestellt werden.
Angenommen, es gibt zwei Datenbanken, eine mit dem Hauptinventar und die andere mit einer Teilmenge dieser Datensätze. Eine Abfrage mit NOT IN
versucht, die Unterschiede zwischen diesen beiden Datenbanken zu finden:
<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 lieferte jedoch nicht die erwarteten Ergebnisse. Es werden alle Datensätze ausgeschlossen, auch wenn sie in der Teildatenbank vorhanden sind. Der Mangel an Daten wirft die Frage auf: „Was ist schief gelaufen?“
Die Antwort liegt in der Möglichkeit von NULL-Werten in der Teilmengendatenbank. Wenn ein NULL-Wert gefunden wird, wird die-Abfrage als NULL ausgewertet, wodurch diese Datensätze ausgeschlossen werden. Dieses Verhalten ist auf die von SQL verwendete dreiwertige Logik zurückzuführen, bei der Prädikate „Wahr“, „Falsch“ oder „Unbekannt“ zurückgeben können. NOT IN
Verwenden Sie : 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>
Verwenden Sie anstelle von NOT EXISTS
: NOT IN
<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>
bietet normalerweise eine bessere Leistung, indem er den Ausführungsplan vereinfacht. NOT EXISTS
Das obige ist der detaillierte Inhalt vonWarum gibt meine SQL-Abfrage „NOT IN' unerwartete Ergebnisse zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!