1

MySQLで以下がどのように機能するか混乱しています。以下のクエリでは、最初のクエリはSELECTからのすべての行を返しtable2、2番目のクエリはどの行SELECTも返しません。オペレーターNULLとの連携の説明はありますか?NOT INこれを説明するドキュメントはありますか?

CREATE TABLE table1 (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (id)
);

CREATE TABLE table2 (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   table1_id INT UNSIGNED,
   PRIMARY KEY (id)
);

INSERT INTO table2 (id, table1_id) VALUES (1, NULL);

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT id FROM table1);
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+

INSERT INTO table1 (id) VALUES (1);

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT id FROM table1);
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
4

2 に答える 2

5

その理由は、SQL仕様によれば、にFoo IN(A,B,C)変換されるため( Foo = A Or Foo = B Or Foo = C )です。したがって、私たちが持っている場合、私たちはFoo In(Null, 1, 2)を取得しFoo = Null Or Foo = 1 Or Foo = 2ます。Foo = Nullは常にフィルタリングの目的でUNKNOWN評価されるためFalse、IN式のNullは結果を返しません。

于 2012-06-29T02:53:17.903 に答える
0

サブクエリに追加IFNULL(id, '')して、機能するようにすることができます。例:

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT IFNULL(id, '') FROM table1);
于 2021-09-23T09:19:36.557 に答える