【问题标题】:Access SQL subquery WHERE clause doesn't filter results [closed]访问 SQL 子查询 WHERE 子句不过滤结果 [关闭]
【发布时间】:2020-01-02 22:27:55
【问题描述】:

我对 Access 数据库中的查询有疑问。该数据库将用于存储和管理体育联赛的基本统计数据。 这是我的查询字符串:

SELECT Participants.Name AS Name
, Count(Games.Participants) AS NumberOfGames
, (

     SELECT Name
     , Count(Games.Winner)
     FROM Participants
     INNER JOIN Games
          ON Participants.ID = Games.Winner
     WHERE Participants.ID = Games.Winner

   ) AS Won
FROM Participants
INNER JOIN Games 
     ON Participants.ID = Games.Participants.Value
GROUP BY Participants.Name
ORDER BY Participants.Name;

由于某种原因,子查询返回所有记录的数量,而不仅仅是获胜者 ID 与参与者 ID 匹配的记录,我不知道为什么。子查询的内容不在子查询中时有效。当我在子查询的 WHERE 子句中明确声明参与者的 ID 时,它会返回该 ID 的正确值。但我无法让它按照我需要的方式工作。

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。您的查询毫无意义,不会在 MS Access(或任何其他数据库)中运行。
  • 您的子查询 WHERE 没有意义。您有一个与Participants.ID = Games.Winner 上的两个表匹配的JOIN,它返回两个值匹配的所有行,然后是一个WHERE Participants.ID = Games.Winner,它再次返回两个值匹配的所有行。我不认为那是你想要的。为了提供帮助,您需要样本数据和您希望从该数据中获得的输出。
  • @KenWhite 我的问题是无论我如何JOIN 或我如何陈述WHERE 子句,它总是返回 Games 表中的每条记录。
  • 正如我所说,如果没有样本数据和输出,我们将无法为您提供帮助。您尚未提供必要的信息。使用一个无用的 WHERE 子句来模仿 JOIN 已经做了什么不会成为一个解决方案。

标签: sql ms-access


【解决方案1】:

您需要将您的子查询与外部查询相关联 - 目前您的子查询没有连接,因此返回所有参与者的结果。如果没有样本数据,很难确定,但这应该可行:

SELECT Participants.Name AS Name, 
       Count(Games.Participants) AS NumberOfGames,
       (SELECT Count(Winner)
        FROM Games 
        WHERE Games.Winner = Participants.ID) AS Won
FROM Participants
INNER JOIN Games ON Participants.ID = Games.Participants.Value
GROUP BY Participants.Name
ORDER BY Participants.Name;

【讨论】:

    【解决方案2】:

    我猜你会想要使用条件聚合:

    select 
        p.name as name, 
        count(*) as numberofgames, 
        sum(iif(g.winner = p.id,1,0)) as won
    from 
        participants p inner join games g on p.id = g.participants
    group by 
        p.name
    order by 
        p.name
    

    这里的pg 只是别名,以免重复输入表名。

    【讨论】:

    • 致反对者:这可能是正确的。 Access SQL 的工作方式与 ANSI SQL 略有不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2017-07-22
    • 2018-12-22
    相关资源
    最近更新 更多