访问 SQL 子查询 WHERE 子句不过滤结果 [关闭]

Posted

技术标签:

【中文标题】访问 SQL 子查询 WHERE 子句不过滤结果 [关闭]【英文标题】:Access SQL subquery WHERE clause doesn't filter results [closed] 【发布时间】: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 已经做了什么不会成为一个解决方案。 【参考方案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 略有不同。

以上是关于访问 SQL 子查询 WHERE 子句不过滤结果 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SQL左连接与JOIN条件中的过滤器与WHERE子句中的过滤器[重复]

SQL在where子句中使用子选择中的列

带有两个日期列的 sql 查询“where 子句”

带有WHERE子句逻辑的SQL Server存储过程

SQL 中 EXISTS 与 NOT EXISTS

一文讲懂SQL子查询