选择具有连接计数记录的不同记录
Posted
技术标签:
【中文标题】选择具有连接计数记录的不同记录【英文标题】:Select distinct record with join count records 【发布时间】:2016-01-11 14:55:31 【问题描述】:我有两个表:Company和Contact,是一对多的关系。 我有另一张表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)中与 JOIN
ed 表不匹配的任何行都不会显示在您的结果中。尝试改用LEFT OUTER JOIN
。
COUNT
和 Contact.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 (...)