6

私はこのテーブルを持っています:

select count(distinct clean_deep_link) from tbl_1;
+---------------------------------+
| count(distinct clean_deep_link) |
+---------------------------------+
|                          121211 |
+---------------------------------+

私はこのクエリを持っています:

select count(1) from tbl_1 where clean_deep_link IN
  (select clean_deep_link from tbl_2);

+----------+
| count(1) |
+----------+
|    66360 |
+----------+

しかし、クエリを変更するnot inと、空のセットが返されます:

select count(1) from tbl_1
where clean_deep_link not in (select clean_deep_link from tbl_2);
+----------+
| count(1) |
+----------+
|        0 |
+----------+

これはどのように可能ですか?サブクエリにレコードの約半分が含まれている場合、サブクエリの にnot残りの半分を含めるべきではありませんか? ここで何が欠けていますか?

ありがとう

4

3 に答える 3

9

私はそれtbl_1.clean_deep_linkNULL残りの行のためであると思います。

これらの値は、サブクエリINでもありませんNOT IN


NULL他の理由は、あなたがに持っているということかもしれませんtbl_2.clean_deep_link

次のことを試してください。

select count(1) from tbl_1
where clean_deep_link not in (select clean_deep_link
                              from tbl_2 WHERE clean_deep_link IS NOT NULL);

の問題NULLは、それが=<>でも他の値(を含むNULL)でもないことです。

をチェックするときNOT IN、MySQLは、値がtbl_1含まれていないという点で各値をチェックする必要があります。したがって、値が含まれtbl_2ているかどうかをチェックします<>

あなたの価値観はそうではなかっ <> NULLたので、そうではありませんでし NOT INた。

参照:null値でのNOTIN演算子の使用


SQLFiddleの例を確認してください。

于 2012-05-16T07:38:53.460 に答える
2

MySQLのNULL列は個別のものとしてカウントされるため、3 つのNULL値はすべて個別と見なされます。

NULL他の場所で述べたように、従来の比較演算子を使用して他の値INと比較することはできませんNOT IN

次の演算子はNULL値を処理できます

x <=> y - returns 1 if x == y (even if both are NULL)
x IS NULL - returns 1 if x is null
x IS NOT NULL - returns 0 if x is null
于 2012-05-16T07:45:26.910 に答える
0
SELECT COUNT(*) - COUNT(1) 
FROM tbl_1 
WHERE clean_deep_link IN (
    SELECT clean_deep_link 
    FROM tbl_2
);
于 2012-05-16T07:49:02.543 に答える