PostgreSQL:在哪里而不是在哪里
Posted
技术标签:
【中文标题】PostgreSQL:在哪里而不是在哪里【英文标题】:PostgreSQL: WHERE IN and NOT WHERE IN 【发布时间】:2012-10-05 05:04:20 【问题描述】:我有两个表A
和B
,A
通过字段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:在哪里而不是在哪里的主要内容,如果未能解决你的问题,请参考以下文章