【问题标题】: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,它返回了相同的结果(低于预期的结果)。

【问题讨论】:

标签: sql ms-access


【解决方案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。

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 2019-06-18
    • 2019-01-28
    • 1970-01-01
    • 2023-01-09
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多