【问题标题】:SQL: MS Access query results change when new inner join addedSQL:添加新的内部联接时 MS Access 查询结果发生变化
【发布时间】:2019-10-13 13:24:16
【问题描述】:

三个表:

  1. 活动
  2. 匹配项
  3. 收视率

每个匹配项都与一个活动相关联(AID 作为外键)。每个活动都有多个评论。

我正在尝试计算每个活动关联的匹配数:

SELECT MATCHES.AID, Count(MATCHES.AID) AS CountOfAID
FROM ACTIVITIES INNER JOIN MATCHES ON ACTIVITIES.AID = MATCHES.AID
GROUP BY MATCHES.AID;

返回这个就好了:

但是,一旦我添加了内部连接,还包括每个活动的平均评分:

SELECT ACTIVITIES.[Activity Name], Count(MATCHES.AID) AS CountOfAID, 
Avg(RATINGS.Rating) AS AvgOfRating
FROM (ACTIVITIES INNER JOIN MATCHES ON ACTIVITIES.AID = MATCHES.AID) INNER 
JOIN RATINGS ON ACTIVITIES.AID = RATINGS.AID
GROUP BY ACTIVITIES.[Activity Name];

发生这种情况:

我该如何解决这个问题?

【问题讨论】:

  • 这是一个常见的错误,人们希望在某些聚合的共享键上加入(每个都可能涉及加入),但他们错误地尝试进行所有加入,然后对之前的聚合进行所有聚合或聚合。在聚合之前查看连接。请在代码问题中提供minimal reproducible example--cut & paste & runnable code;具有期望和实际输出的示例输入(包括逐字错误消息);明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)
  • use text, not images/links, for text--including tables & ERDs. 转述或引用其他文本。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图片中包含图例/键和说明。

标签: sql ms-access join select


【解决方案1】:

由于评论和匹配都加入了活动,但它们之间没有任何关系,因此您实际上是在为每个活动创建一个评论匹配产品。获得所需结果的一种方法是(独立地)对匹配和评论的子查询进行分组,然后才将它们加入活动:

SELECT a.[Activity Name], CountOfAID, AvgOfRating
FROM   activities a
JOIN   (SELECT   aid, COUNT(*) AS CountOfAID
        FROM     matches
        GROUP BY aid) m ON a.aid = m.aid
JOIN   (SELECT   aid, AVG(rating) AS AvgOfRating
        FROM     ratings
        GROUP BY aid) r ON a.aid = r.aid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多