【问题标题】:Why using COUNT with SELF JOIN gives different result value为什么将 COUNT 与 SELF JOIN 结合使用会产生不同的结果值
【发布时间】:2017-01-20 11:18:16
【问题描述】:

有人能解释一下为什么如果我使用 SELF JOIN 和 COUNT 会得到与仅使用 COUNT 命令不同的结果吗? 与ControlNo 列相同的表。列中的值不是唯一的。 这个查询给了我15586的总计数。

    select  (Select  COUNT(ControlNo) 
                from tblQuotes Q1 
                where Q1.ControlNo = a.ControlNo
            ) QuotedTotal
    FROM    tblQuotes a 
   inner join  lstlines l on a.LineGUID = l.LineGUID
   where    l.LineName = 'EARTHQUAKE' AND YEAR(EffectiveDate) = 2016

但是,如果我运行这个查询,它会给我15095 的总数。

select  COUNT(ControlNo) as QuotedTotal
from    tblQuotes a
inner join  lstlines l on a.LineGUID = l.LineGUID
  where     l.LineName = 'EARTHQUAKE' AND YEAR(EffectiveDate) = 2016

究竟是什么改变了总量,为什么? 为什么我要使用第一种情况? 是否有任何方法可以修改第一个查询以获得15586 的总和而不按每一行分解? 谢谢你

【问题讨论】:

  • 如果您首先共享表结构会有所帮助。 ControlNo 是唯一字段吗?似乎tblQuotes 中有一些行共享ControlNo 字段中的值,但并非所有行都加入lstlines 表。您是否也需要计算这些?
  • ControlNo不是唯一的,这可能是结果不同的原因。

标签: tsql join count


【解决方案1】:

这似乎是因为字段ControlNo 不是唯一的,并且有一些记录共享该值,尽管并非所有记录都以该条件加入lstlines 表。所以基本上你的最后一个查询是:

SELECT COUNT(a.ControlNo)
FROM lstlines l
INNER JOIN tblQuotes a ON a.LineGUID = l.LineGUID
WHERE l.LineName = 'EARTHQUAKE' AND YEAR(EffectiveDate) = 2016

虽然第一个基本上是这样:

SELECT COUNT(b.ControlNo)
FROM lstlines l
INNER JOIN tblQuotes a ON a.LineGUID = l.LineGUID
INNER JOIN tblQuotes b ON a.ControlNo = b.ControlNo
WHERE l.LineName = 'EARTHQUAKE' AND YEAR(EffectiveDate) = 2016

如您所见,在第二个查询中,您不仅计算与lstlines 表匹配的行,还计算tblQuotes 中与ControlNo 匹配的所有行与@987654328 匹配的行@。

【讨论】:

  • 很高兴能提供帮助。这些查询是否偶然返回与您的查询相同的数字?
  • 不,它们返回的数字不同。应该是这样的,对吗?
  • 不,我的意思是我的第一个查询返回 15095,第二个查询返回 15586,就像您的两个查询一样。
  • 哦,是的。确实如此。所以它都是正确的。再次感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多