如果会话中的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'))
此架构是用于分析目的的静态转储,因此不会出现并发问题...
答案 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;