2016-06-11 8 views
1

私は2つのテーブルを持っていますテーブル1テーブル2です。そして、彼らのコンテンツnull値が存在する場合、Mysqlは値を返しません。サブクエリ

mysql> select id from table1; 
+------+ 
| id | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
+------+ 
4 rows in set (0.00 sec) 

mysql> select id from table2; 
+------+ 
| id | 
+------+ 
| 301 | 
| 2 | 
| NULL | 
+------+ 
3 rows in set (0.00 sec) 

私はmysqlのコンソールで以下のクエリを打ったとき、それは常に空のセットを返し

select id 
from table1 
where id 
not in (select id from table2); 

空のセット(0.00秒)

が時に理由がある次のようにサブクエリにNULL値がありますにはないには故障?

私はセットで

select id 
from table1 
where id 
not in (select id from table2 where id is not null); 
+------+ 
| id | 
+------+ 
| 1 | 
| 3 | 
| 4 | 
+------+ 

3行(0.00秒)

ちょうど事前に

感謝を知りたい以下のクエリを使用して、それを解決してきました:)

編集:This question空気を少しでも取り除こうとしますが、十分ではありません

+0

[MYSQL INキーワードがNULL値を考慮しない理由](0120-1810391/why-mysql-in-keyword-not-considering-null-values) –

+1

ようこそ* Three-Valued-Logic *:https://en.wikipedia.org/wiki/Three-valued_logic#Application_in_SQL – dnoeth

答えて

4

それはnot inの仕組みです。私はあなたの代わりにnot existsを使用することをお勧めします:

select id 
from table1 t1 
where not exists (select 1 from table2 t2 where t1.id = t2.id); 

なぜnot inはこのように動作しますか?それはnot inのセマンティクスのためです。 SQLのNULL(通常)は、が不明なの値を意味します。したがって、あなたが "(1,2)"のリストを持っているなら、 "3"がリストにないと言うことができます。あなたは "(1,2、が不明で)"と言えます。代わりに、結果はNULLであり、falseとして処理されます。

NOT EXISTSこのように動作しないので、私はより使いやすいと感じています。

関連する問題