PostgreSQL:在哪里,而不是在哪里

时间:2012-10-15 08:40:05

标签: postgresql where-in

我有两个表ABAB字段引用A.id_b B.id,因此任何id_b值都存在于B.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

怎么可能?

2 个答案:

答案 0 :(得分:1)

此查询告诉我们表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,如表A所示:

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

对此唯一可能的解释是,表A中的某些B.id作为A.id_b在每行中使用多次。 运行此查询将显示表A中所有重复的id_b提及列表:

SELECT a.id_b
FROM A a
GROUP BY a.id_b
HAVING count(a.id_b) > 1

答案 1 :(得分:1)

找到原因。 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