访问 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
这里的p
和g
只是别名,以免重复输入表名。
【讨论】:
致反对者:这可能是正确的。 Access SQL 的工作方式与 ANSI SQL 略有不同。以上是关于访问 SQL 子查询 WHERE 子句不过滤结果 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章