18

奇妙なことが起こっています。Windows にインストールされている MySQL Community Server 5.1 で問題が発生しています。このクエリを実行すると:

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

582行を返します

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

15 行を返します

したがって、次のクエリは 582 - 15 = 567 行を返すと予想されます

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

0 行を返します

この最後のクエリが行を返さないのはなぜですか?

4

3 に答える 3

31

これを試して。

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

または存在しないを使用

 select * 
 from table1 
 where date >= "2012-01-01" and not exists ( select some_key from table2 where table2.some_key = table1.key
于 2012-06-06T12:49:18.900 に答える
14

ほとんどの場合、「キー」列にいくつかの NULL 値があります。NULL 比較では常に null が返され、false と評価されます。これは直感に反する可能性があります。例えば

SELECT * FROM MyTable WHERE SomeValue <> 0 

SomeValue = NULL の値は返されません。直感的にはわかりますが、NULL はゼロではありません。したがって、クエリを修正するには、おそらく次のことを行う必要があります。

select * from table1 where date >= "2012-01-01" 
and (key not in (select some_key from table2) OR key IS NULL);
于 2012-06-06T12:50:01.357 に答える
1
select * 
 from table1 
 where date >= "2012-01-01" 
 and `key` not in (select some_key from table2);
于 2012-06-06T12:49:13.063 に答える