7

フィールド によって参照される とAの2 つのテーブルがあるため、 に存在する任意の値が.BABA.id_b B.idid_bB.id

3 つのクエリがあります。

SELECT COUNT(b.id)
FROM B b
WHERE b.id NOT IN (
    SELECT a.id_b
    FROM A a)

それは私に与えます0;

2 つ目、違いはNOT:

SELECT COUNT(b.id)
FROM B b
WHERE b.id IN (
    SELECT a.id_b
    FROM A a)

このクエリは私に与えます:1899

三つ目:

SELECT COUNT(b.id)
FROM B b

そして、このクエリは私に3599

同じ結果:

SELECT a.id_b
FROM A a

2つのセットに分割することを保証B.idし、両方のセットの要素の数は合計要素数よりも多くなければなりませんが、私は1899 + 0 != 3599を持っています。

それはどうしてですか?

4

2 に答える 2

4

理由が見つかりました。NULLに値を持つ A にレコードがありましたA.id_b。そのため、次のクエリを実行します。

SELECT COUNT(b.id)
FROM B b
WHERE b.id NOT IN (
    SELECT a.id_b
    FROM A a)

戻ってき0ました。

于 2012-10-15T11:24:24.117 に答える
3

このクエリは、テーブル B に合計 3599 行あることを示しています。

SELECT COUNT(b.id)
FROM B b

次のクエリは、B のすべての ID が A で使用されたことを示しています。

SELECT COUNT(b.id)
FROM B b
WHERE b.id NOT IN (
    SELECT a.id_b
    FROM A a)

さらに、このクエリは、テーブル B にはテーブル A で言及されている 1899 個の ID があることを示しています。

SELECT COUNT(b.id)
FROM B b
WHERE b.id IN (
   SELECT a.id_b
   FROM A a)

これに対する唯一の説明は、一部の B.id がテーブル A で行ごとに A.id_b として複数回使用されたことです。このクエリを実行すると、テーブル A 内の id_b のすべての重複した言及のリストが表示されます。

SELECT a.id_b
FROM A a
GROUP BY a.id_b
HAVING count(a.id_b) > 1
于 2012-10-15T09:01:56.337 に答える