postgres选择计数明显返回意外的额外行

时间:2018-10-09 23:10:11

标签: postgresql

如果会话中的UID比用户中的UID多(显然不应该这样),那么我希望在运行最后一个选择时有一个非空的结果集,但是我没有返回任何行-这个结果对我来说不合逻辑...

select count(distinct(uid)) from users;

> 108736

select count(distinct(uid)) from sessions;

> 108737

select count(*) from sessions where uid not in (select uid from users);

> 0

仅出于完整性考虑:

select count(*) from users where uid not in (select uid from sessions);

> 0

我已经检查了空值:

select count( * ) from sessions where uid is null; 

> 0 

select count( * ) from users where uid is null;

> 14

该模式在sqlalchemy中定义,并在会话表中包含外键:

uid = Column(Integer, ForeignKey('users.uid', use_alter=True, name='fk_uid'))

此架构是用于分析目的的静态转储,因此不会出现并发问题...

1 个答案:

答案 0 :(得分:3)

您的第三个查询没有执行您认为的操作。

以下查询说明了该问题:

SELECT 1 NOT IN (SELECT unnest(ARRAY[NULL]::int[]));

这将返回NULL,因为它无法确定是否1 <> NULL。 因此,在您的查询中,where条件始终为NULL,因为users包含一个NULL uid。

我建议使用EXCEPT在会话表中查找罪魁祸首。

SELECT uid from sessions EXCEPT SELECT uid from users;