Как мне учесть расхождение в подсчете в SELECT DISTINCT? - PullRequest
3 голосов
/ 24 марта 2020

Я не думаю, что это даже SQL вопрос, я просто борюсь с логикой c и, вероятно, имею Момент Глупости.

Я пытаюсь найти количество адресов электронной почты, которые существуют в таблице cms, но отсутствуют в таблице cm. Я использую postgres 10.4. Каждая из таблиц содержит один столбец varchar, «email».

Оба этих запроса возвращают счет 18309:

SELECT COUNT(DISTINCT email) FROM cms;
SELECT COUNT(email) FROM cms;

Оба этих запроса возвращают счет 17949:

SELECT COUNT(DISTINCT email) FROM cm;
SELECT COUNT(email) FROM cm;

, что означает, что ... 18309 - 17949 = на 360 записей больше cms, чем cm.

Затем я запрашиваю diff с:

SELECT COUNT(cms.email) FROM cms LEFT JOIN cm ON cm.email = cms.email WHERE cm.email IS NULL;

Этот запрос возвращает 369.

Откуда исходит расхождение?

  • Обе таблицы не содержат в себе повторяющихся записей.
  • В одной таблице на 360 записей больше, чем в другой.
  • В одной таблице существует 369 записей, но нет другой.

Что это за девять записей ??

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Ничего загадочного. В каждой таблице есть электронные письма, которых нет в другой.

У вас есть:

  • 18 309 электронных писем в cms, из которых 17 940 (18 309 - 369) находятся в cm.
  • 17 949 писем в cm, из которых 17 940 в cms.
  • У вас есть 369, которые находятся только в cms.
  • У вас 9, что находятся только в cm.
1 голос
/ 24 марта 2020

В большой таблице содержатся не только электронные письма, которых нет в маленькой таблице, но и в большой электронной почте отсутствуют некоторые электронные письма из маленькой таблицы.

Вы можете использовать full join для подсчета дети-сироты из обеих таблиц:

select 
    count(*) filter(where cm.email  is null) in_cms_but_not_in_cm,  -- 369
    count(*) filter(where cms.email is null) in_cm_but_not_in_cms   -- 9
from cm
full join cms using(email)
where cm.email is null or cms.email is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...