SQL die NICHT IN funktioniert nicht
Ich habe zwei Datenbanken, die hält, die Inventur, und andere, die enthält eine Teilmenge der Datensätze der primären Datenbank.
Die folgende SQL-Anweisung funktioniert nicht:
SELECT stock.IdStock
,stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN
(SELECT foreignStockId FROM
[Subset].[dbo].[Products])
Die nicht in funktioniert nicht. Entfernen der NICHT gibt die richtigen Ergebnisse, also Produkte, die in beiden Datenbanken. Allerdings werden bei Verwendung der NICHT IN ist nicht Rückkehr keine Ergebnisse überhaupt.
Was mache ich falsch, irgendwelche Ideen?
Sind Sie sicher, Sie haben Bestand.IdStock, die nicht in foreignStockId überhaupt?
Haben Sie wirklich alle Elemente, die in
Erklären, was die Abfrage zurückgeben soll. Derzeit gibt es alle Einzelteile auf Lager, wo es kein Produkt in der Teilmenge auf Sie verweisen.
Haben Sie wirklich alle Elemente, die in
Inventory
ist nicht in Subset
?Erklären, was die Abfrage zurückgeben soll. Derzeit gibt es alle Einzelteile auf Lager, wo es kein Produkt in der Teilmenge auf Sie verweisen.
InformationsquelleAutor Sam | 2011-03-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wahrscheinlich gibt eine
NULL
.Einen
NOT IN
Abfrage keine Zeilen zurückgibt, wenn alleNULL
s existiert in der Liste derNOT IN
Werte. Sie können explizit ausgeschlossen werden Sie mitIS NOT NULL
als unten.Oder umschreiben mit
NOT EXISTS
statt.Als auch mit der Semantik, dass Sie möchten, dass der Ausführungsplan für
NOT EXISTS
ist oft einfacher sehen Sie hier.Den Grund für das unterschiedliche Verhalten ist auf die drei geschätzte Logik in SQL. Prädikate auswerten können, um
True
,False
oderUnknown
.Einen
WHERE
- Klausel auswerten mussTrue
damit wird die Zeile zurückgegeben werden soll, aber dies ist nicht möglich, mitNOT IN
wennNULL
vorhanden ist, wie unten erklärt.'A' NOT IN ('X','Y',NULL)
entspricht'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
True
True
Unknown
True AND True AND Unknown
ausgewertetUnknown
pro die Wahrheit Tabellen für drei geschätzte Logik.Den folgenden links haben Sie einige zusätzliche Diskussion über die Leistung der verschiedenen Optionen.
NICHT IN
,OUTER APPLY
,LEFT OUTER JOIN
,AUßER
oderNICHT VORHANDEN
?NICHT IN
vs.NICHT VORHANDEN
vs.LEFT JOIN /NULL
: SQL ServerLeft outer join
vsNICHT VORHANDEN
NICHT VORHANDEN
vsNICHT IN
Diese Feste für mich. Select * From x Where x.y not in( Select Distinct ISNULL(c,0))
Die IST NICHT NULL, ist der sub-query funktioniert der trick. Danke
SUPERRRRRRRRRRRRRRRRR.......... Ich Danke Ihnen, Sir.
InformationsquelleAutor Martin Smith
Wenn NICHT IN nicht funktioniert, können Sie immer versuchen, zu tun, LEFT JOIN. Filtern Sie dann durch WO mit einem der Werte aus der verknüpften Tabelle, die NULL. Vorausgesetzt, der Wert, den Sie waren Zusammenfügen von nicht enthalten alle NULL Wert.
InformationsquelleAutor MPękalski
Können Sie auch use-Case-Klausel zur Bekämpfung derartiger Probleme
diese syntax funktioniert in SQL Server -, Oracle-und postgres -
InformationsquelleAutor Raj Kamal