2012-06-06 26 views
8

Seltsames passiert. Ich habe ein Problem mit meinem MySQL Community Server 5.1 installiert auf Windows NICHT IN Abfrage. Wenn ich diese Abfrage tun:MySQL "NICHT IN" funktioniert nicht

select * 
    from table1 
    where date >= "2012-01-01"; 

liefert 582 Zeilen

select * 
    from table1 
    where date >= "2012-01-01" 
    and the_key in (select some_key from table2); 

Renditen 15 Reihen

so würde ich erwarten, dass die folgende Abfrage 582 zurückkommen würde - 15 = 567 Zeilen

select * 
from table1 
where date >= "2012-01-01" 
and the_key not in (select some_key from table2); 

gibt 0 Zeilen zurück

Warum gibt diese letzte Abfrage keine Zeilen zurück?

+1

** Schlüssel ** ist ein Schlüsselwort in SQL Versuchen Sie, es mit Backticks zu zitieren –

+2

Kann 'some_key' null sein? –

+0

Versuchen Sie 'wo (Datum> =" 2012-01-01 ") und (Taste nicht in ...)'; MySQL-Dokumente sind vage auf dem 'not in'-Operator und geben an, dass' expr NOT IN (Wert, ...) dasselbe ist wie NOT (expr IN (Wert, ...)) ', was zu 'NOT' führen könnte. (Datum> = "2012-01-01" und Schlüssel) IN (...)) 'in Ihrem Fall – lanzz

Antwort

15

Versuchen Sie dies.

select * 
from table1 
where date >= "2012-01-01" 
and `key` not in (select some_key from table2 where some_key is not null); 

Oder mit existiert nicht

select * 
from table1 
where date >= "2012-01-01" and not exists (select some_key from table2 where table2.some_key = table1.key 
+0

Nett, sie arbeiten beide und scheinen ungefähr die gleiche Menge an Zeit zu benötigen. Vielen Dank! –

+0

@jeffery_the_wind froh, Ihnen zu helfen! –

1
select * 
from table1 
where date >= "2012-01-01" 
and `key` not in (select some_key from table2); 
5

Höchstwahrscheinlich werden Sie in Ihrem "Schlüssel" -Spalte einige NULL-Werte haben. NULL-Vergleiche geben immer null zurück, was zu false führt. Dies kann kontraintuitiv sein. Zum Beispiel

SELECT * FROM MyTable WHERE SomeValue <> 0 

Die Werte würden nicht mit SomeValue = NULL zurückgegeben. Auch wenn intuitiv NULL nicht gleich Null ist. Um die Frage, die Sie haben, zu beheben, sollten Sie Folgendes tun.

select * from table1 where date >= "2012-01-01" 
and (key not in (select some_key from table2) OR key IS NULL);