SELECT foreignStockId
FROM [Subset].[dbo].[Products]
Gibt wahrscheinlich a zurück NULL.
Eine NOT INAbfrage gibt keine Zeilen zurück, wenn in der Werteliste NULLs vorhanden NOT INsind. Sie können sie explizit IS NOT NULLwie folgt ausschließen.
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)
Oder schreiben Sie NOT EXISTSstattdessen mit.
SELECT stock.idstock,
stock.descr
FROM [Inventory].[dbo].[Stock] stock
WHERE NOT EXISTS (SELECT *
FROM [Subset].[dbo].[Products] p
WHERE p.foreignstockid = stock.idstock)
Die Semantik, für die Sie den Ausführungsplan wünschen, NOT EXISTSist oft einfacher, als hier dargestellt .
Der Grund für den Unterschied im Verhalten liegt in der dreiwertigen Logik, die in SQL verwendet wird. Prädikate zu bewerten True, Falseoder Unknown.
Eine WHEREKlausel muss ausgewertet werden, Truedamit die Zeile zurückgegeben wird. Dies ist jedoch nicht möglich, NOT INwenn sie NULLvorhanden ist, wie unten erläutert.
'A' NOT IN ('X','Y',NULL) ist äquivalent zu 'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
- 'A' <> 'X' =
True
- 'A' <> 'Y' =
True
- 'A' <> NULL =
Unknown
True AND True AND Unknownausgewertet nach Unknownden Wahrheitstabellen für drei wertige Logik .
Die folgenden Links enthalten zusätzliche Informationen zur Leistung der verschiedenen Optionen.