PostgreSQL:在哪里而不是在哪里

Posted

技术标签:

【中文标题】PostgreSQL:在哪里而不是在哪里【英文标题】:PostgreSQL: WHERE IN and NOT WHERE IN 【发布时间】:2012-10-05 05:04:20 【问题描述】:

我有两个表ABA 通过字段B 引用A.id_b B.id,因此B.id 中存在任何id_b 值。

我有三个问题: 第一个:

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

怎么可能?

【问题讨论】:

是的,独一无二。首要的关键。和 A.id_b id 外键,具有 NOT NULL 约束。 旁注:最后一个查询没有COUNT函数。是故意的吗? 不,这只是前两个查询的子查询。 而不是编辑问题。您应该(必须)添加您自己的答案并接受它。 没想到我能回答我自己的问题...谢谢。 【参考方案1】:

找到原因了。 A中有记录,在A.id_b中有NULL的值。这就是为什么要查询:

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

正在返回0

【讨论】:

【参考方案2】:

这个查询告诉我们表 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)

对此唯一可能的解释是表 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

【讨论】:

感谢您的回答。嗯,是的,B 中的行使用了表 A 中的更多行。但是这对NOT IN 选择有何影响?我有0 B 行,它没有在 A 中使用,1899 行使用了。其余的在哪里? 在此查询中 SELECT COUNT(b.id) FROM B b WHERE b.id IN ( SELECT a.id_b FROM A a) IN (...) 隐式运行唯一选择。它只找到了 1899 个独特的 没错,我的问题是 B 的其余元素在哪里,为什么它们没有出现在 NOT IN 查询中。 好吧,我们只能得出结论,表 A 中从未提到过 1700 个“缺失”的 B id。B 有可能是空值吗? 如果 B 有空值,这可以解释一切。在 SQL 中,NULL 处理可以被认为是奇怪的。例如,没有什么可以等于 NULL,甚至是 NULL 本身。并且 NULL 永远不能是任何子集的成员。它不能不是任何子集的成员。奇怪,不是吗? :-)

以上是关于PostgreSQL:在哪里而不是在哪里的主要内容,如果未能解决你的问题,请参考以下文章

我在 ubuntu 12.04 中的 postgresql *.conf 文件在哪里?

PostgreSQL 将数据库存储在哪里?

PostgreSQL 将数据库存储在哪里?

postgresql 聚合函数存储在哪里?

PostgreSQL 更新在哪里和

Postgresql字符串匹配在哪里