Sql 如何解释SELECT DISTINCT中的计数差异?

Sql 如何解释SELECT DISTINCT中的计数差异?,sql,postgresql,duplicates,Sql,Postgresql,Duplicates,我甚至不认为这是一个SQL问题,我只是在逻辑上挣扎,可能会有一段愚蠢的时间 我正在尝试查找表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

我甚至不认为这是一个SQL问题,我只是在逻辑上挣扎,可能会有一段愚蠢的时间

我正在尝试查找表
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=在
cms
中比
cm
中多记录360条

然后,我将通过以下方式查询差异:

从cms左侧选择计数(cms.email)加入cm.email=cms.email,其中cm.email为空

此查询返回369

差异从何而来

  • 两个表本身都不包含重复记录
  • 一个表比另一个表多360条记录
  • 一个表中存在369条记录,而另一个表中不存在

那九张唱片是什么?

没什么神秘的。每个表中都有电子邮件,而另一个表中没有

你有:

  • cms
    中有18309封电子邮件,其中17940封(18309-369封)在
    cm
  • 17949封电子邮件在
    cm
    中,其中17940封在
    cms
  • 您有369个仅在cms中
  • 您有9个仅在
    cm

不仅大表中有不在小表中的电子邮件,而且大表中也缺少一些来自小表的电子邮件

您可以使用
完全联接
来计算两个表中的孤立项:

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

该列中有空值吗?有些记录不匹配。啊,当然。一个愚蠢的时刻。虽然现在我必须从一个商业角度来计算,记录是如何在表B中结束的,而不是通过表a,这应该是不可能的。是的。无论如何,非常感谢。