选择具有连接计数记录的不同记录

Posted

技术标签:

【中文标题】选择具有连接计数记录的不同记录【英文标题】:Select distinct record with join count records 【发布时间】:2016-01-11 14:55:31 【问题描述】:

我有两个表:CompanyContact,是一对多的关系。 我有另一张表Track,它将一些公司标识为其他公司的母公司。

我想编写一个 SQL 查询,从 Track 中选择母公司以及每个母公司的联系人数量。

SELECT Track.ParentId, Count(Contact.companyId) 
FROM Track     
    INNER JOIN Contact
    ON Track.ParentId = Contact.companyId
GROUP BY Track.ParentId

但是,结果包含的记录少于我运行以下查询时的记录:

SELECT DISTINCT Track.ParentId
FROM Track

我尝试了第一个查询并添加了DISTINCT,它返回了相同的结果(低于预期的结果)。

【问题讨论】:

阅读mattmazur.com/2017/11/01/… 【参考方案1】:

您正在对 Contact 表执行 INNER JOIN,这意味着第一个表(在本例中为 Track)中与 JOINed 表不匹配的任何行都不会显示在您的结果中。尝试改用LEFT OUTER JOIN

COUNTContact.companyId 只会计算匹配的行(Contact.companyId 不是 NULL)。由于您正在计算联系人,因为它们将计为 0。如果您尝试计算其他一些数据集并尝试在特定列(而不是 COUNT(*))上执行 COUNT,那么任何 NULL该列中的值不会计入您的总数,这可能是也可能不是您想要的。

【讨论】:

看起来不错,但是另外,如果 rosa 想要 0 或 null 计数,可能需要使用 coalese 或 case 或 isnull 或其他变体调整计数以返回 0 而不是 null。也许coalesce(count(contact.companyID)) as cnt 是的,具体取决于可能需要的具体要求。好点。 我不能使用左外连接,因为我使用的是访问权限,但我找到的答案是相似的。谢谢。 @xQbert,任何人都可以详细说明 0 或 null 备注吗?我不明白。记住-我正在使用 ms-access 我添加了对 NULL 值的 COUNT 的解释。希望它足够清楚。【参考方案2】:

我使用了一个 INNER JOIN,它只返回两个表中相同的记录。

要从 Track 表中返回 所有 记录,以及在 Contact 表中匹配的记录,我需要使用 LEFT JOIN。

【讨论】:

以上是关于选择具有连接计数记录的不同记录的主要内容,如果未能解决你的问题,请参考以下文章

选择不同的...内部连接与选择...其中 id in (...)

如何连接具有选择性重复记录的表? (oracle10g)

选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列

如何从具有最后时间戳的数据框中选择不同的记录

Postgresql从具有不同列数的2个表中选择多条记录

SQL查询以选择在同一列中具有不同值的子记录的父级