【问题标题】:PostgreSQL: WHERE IN and NOT WHERE INPostgreSQL:在哪里而不是在哪里
【发布时间】: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函数。是故意的吗?
  • 不,这只是前两个查询的子查询。
  • 而不是编辑问题。您应该(必须)添加您自己的答案并接受它。
  • 没想到我能回答我自己的问题...谢谢。

标签: postgresql where-in


【解决方案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 永远不能是任何子集的成员。它不能不是任何子集的成员。奇怪,不是吗? :-)
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多