postgres select count count возвращает неожиданную дополнительную строку - PullRequest
0 голосов
/ 10 октября 2018

Если в сеансах есть еще один 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 голосов
/ 10 октября 2018

Ваш третий запрос не выполняет то, что вы думаете.

Следующий запрос иллюстрирует проблему:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...