SELECT foreignStockId
FROM [Subset].[dbo].[Products]
Gibt wahrscheinlich a zurück NULL
.
Eine NOT IN
Abfrage gibt keine Zeilen zurück, wenn in der Werteliste NULL
s vorhanden NOT IN
sind. Sie können sie explizit IS NOT NULL
wie 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 EXISTS
stattdessen 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 EXISTS
ist 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
, False
oder Unknown
.
Eine WHERE
Klausel muss ausgewertet werden, True
damit die Zeile zurückgegeben wird. Dies ist jedoch nicht möglich, NOT IN
wenn sie NULL
vorhanden 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 Unknown
ausgewertet nach Unknown
den Wahrheitstabellen für drei wertige Logik .
Die folgenden Links enthalten zusätzliche Informationen zur Leistung der verschiedenen Optionen.