【问题标题】:Unusual behavior of aggregate func + several joins聚合 func + 多个连接的异常行为
【发布时间】:2020-05-27 07:04:34
【问题描述】:

这是我的 RDB 结构。

我尝试计算与单个位置相关的部门和员工的数量。

select street_address, count(distinct(d.department_id)), count(emp.employee_id) 
from locations loc 
inner join departments d 
on d.location_id = loc.location_id
inner join employees emp 
on emp.department_id =d.department_id
group by street_address

查询执行结果:

但是不使用 distinct 来计算 d.department_id 会产生错误的结果。

有人能解释一下在查询执行期间发生了什么以及为什么distinct 解决了这个问题吗?

【问题讨论】:

  • 自行查找的最佳方法是删除分组依据并选择实际值。我会从一个地址开始。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 隔离第一个不输出您期望的子表达式并说出您的期望和原因。
  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。
  • sum data from multiple tables 的副本。这涉及一个常见错误,即人们想要一些连接,每个可能涉及不同的键,一些子查询,每个可能涉及连接和/或聚合,但他们错误地尝试先进行所有连接,然后再进行所有聚合或聚合以前的聚合.在适当的行上编写单独的聚合和/或聚合一个案例语句选择行;加入常见的唯一列集。有时 DISTINCT 聚合会在非键(重复)连接后选择正确的值。

标签: sql inner-join


【解决方案1】:

count(d.department_id) 计数错误的原因是有多个员工与相同的部门 ID 相关,这就是为什么您获得相同数量的部门和员工。

当您使用count(distinct d.department_id) 时,distinct 将只对每个department_id 计数一次,而不是在每次找到与department_id 关联的员工时计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 2021-01-06
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多