7

我有两个表,A并且由字段引用,因此任何值都存在于.BABA.id_b B.idid_bB.id

我有三个查询: 第一个:

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

它给了我0

第二个,区别仅在于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

保证我B.id分成两组,并且两组中的元素计数必须有很多总元素计数,但我有:1899 + 0 != 3599

那怎么可能?

4

2 回答 2

4

找到了原因。A 中有记录,其NULL值为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 有 1899 个 id,这些 id 在表 A 中提到:

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 回答