ADO 无法识别旧式 SQL 联接。不知道如何在此特定查询中使用新式语法

ADO not recognising old-style SQL joins. Don't know how to use new-style syntax in this particular query

我正在 VBA 编写代码,使用 ADO 查询兼容 Access (JET) 的数据库。我有以下查询,效果很好:

SELECT
   Answers.UserName AS UserName,
   COUNT(Answers.Correct) AS CorrectAnswers
FROM
   Answers
WHERE
   Answers.QuizID=17
   AND (SELECT COUNT(A.UserName) FROM Answers A WHERE A.QuizID=17 AND A.UserName=Answers.UserName)=30
GROUP BY Answers.UserName

这基本上是一个问答测验,每个答案都写在答案中 table。答案 table 的一列是 "UserName",其中包含提交答案的用户的登录 ID。

但是我想显示用户的全名而不是登录 ID。这已经存储在单独的 table、"Users" 中。在 "Users" table 中有两列:UserName 和 FullName。

自然地,显示全名的正确方法是使用如下连接:

SELECT
   Users.FullName AS FullName,
   COUNT(Answers.Correct) AS CorrectAnswers
FROM
   Answers,
   Users
WHERE
   Answers.QuizID=17
   AND (SELECT COUNT(A.UserName) FROM Answers A WHERE A.QuizID=17 AND A.UserName=Answers.UserName)=30
   AND Users.UserName=Answers.UserName
GROUP BY Users.UserName

这也有效...只要 UserName 存在于用户 table 中即可。但是,如果由于某种原因用户未在用户中注册 table,而不是返回 NULL,则不会完全选择记录。

在 "old-style" 连接语法中,我会通过在上面代码的相关行上添加一个 (+) 符号来解决这个问题,因此它显示为:

AND Users.UserName=Answers.UserName(+)

这将确保返回所有记录,即使用户 table 中不存在匹配项。但是,当我尝试这样做时,ADO 抛出一个错误:Extra ( in query expression... etc。我假设这是因为 ADO 无法识别 (+) 语法。

所以问题是,是否有办法让 ADO 识别 (+) 连接;或者我应该如何在 "new style" 连接语法中编写查询以使其执行我想要的操作?

我试过的:

SELECT
   Users.FullName AS UserName,
   COUNT(Answers.Correct) AS CorrectAnswers
FROM
   Answers,
   RIGHT JOIN Users U on Answers.Username = U.UserName
WHERE
   Answers.QuizID=17
   AND (SELECT COUNT(A.UserName) FROM Answers A WHERE A.QuizID=17 AND A.UserName=Answers.UserName)=30
GROUP BY Users.FullName

但这行不通。它只是抛出 Syntax Error。我也试过 Answers 后面没有逗号,但没有用。

有很多在线资源告诉人们如何使用新式联接。但是,我还没有看到任何东西告诉我如何正确地执行此操作,其中查询包含 WHERE 中的其他子句。实际上,我发现所有新型连接示例都相对简单,其中演示了如何在两个 table 上执行单个连接 - 没有其他查询元素。然而,当查询稍微复杂一些时,就不清楚应该如何使用语法了。

您需要的是 LEFT 连接 AnswersUsers 基于 ON 两个表中的列 UserName
这意味着即使 Users.
中没有匹配项,也会返回 Answers 的所有行 但还有另一个问题:在 SELECT 列表中你有列 FullName 尽管你没有将它包含在 GROUP BY 子句中并且这是不允许的。
所以我也将它包含在 GROUP BY 中:

SELECT
   a.UserName, u.FullName,
   COUNT(a.Correct) AS CorrectAnswers
FROM Answers a LEFT JOIN Users u
ON u.UserName = a.UserName
WHERE a.QuizID=17
  AND 
 (SELECT COUNT(aa.UserName) FROM Answers aa WHERE aa.QuizID = a.QuizID AND aa.UserName = a.UserName) = 30
GROUP BY a.UserName, u.FullName

虽然我不知道 WHERE 子句中子查询的原因,但我相信它可以像这样移动到 HAVING 子句中:

SELECT
   a.UserName, u.FullName,
   COUNT(a.Correct) AS CorrectAnswers
FROM Answers a LEFT JOIN Users u
ON u.UserName = a.UserName
WHERE a.QuizID=17
GROUP BY a.UserName, u.FullName
HAVING COUNT(*) = 30