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

问题描述 投票:0回答:1

我正在VBA中进行编码,使用ADO查询访问兼容(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

这基本上是一个问答游戏,每个答案都将写入答案表。答案表的一列是“用户名”,其中包含提交答案的用户的登录ID。

但是我想显示用户的全名,而不是登录ID。这已经存储在单独的表“用户”中。在“用户”表中,有两列: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

这也可以工作,只要在Users表中存在UserName。但是,如果由于某种原因未在Users表中注册该用户,而不是返回NULL,则不会完全选择该记录。

在“旧式”连接语法中,我将通过在上述代码的相关行上添加一个(+)符号来解决此问题,因此它显示为:

AND Users.UserName=Answers.UserName(+)

这将确保返回所有记录,即使在Users表中不存在匹配项也是如此。但是,当我尝试此操作时,ADO抛出错误:Extra ( in query expression... etc。我认为这是因为ADO无法识别(+)语法。

所以问题是,是否存在一种使ADO识别(+)联接的方法;还是应该以“新样式”联接语法编写查询以使其执行我想要的工作?

我尝试过的事情:

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中的其他子句的情况下,我还没有看到任何显示出如何正确执行此操作的内容。确实,我发现所有新式联接示例都相对简单,在该示例中,我们演示了如何在两个表上执行单个联接-查询中没有其他元素。但是,即使查询变得更加复杂,也不清楚应如何使用语法。

sql ms-access join left-join ado
1个回答
2
投票

您需要的是将两个表中的LEFT列基于AnswersUsersONUserName连接。这意味着即使Answers中没有匹配项,也将返回Users的所有行。但是,还有另一个问题:在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
© www.soinside.com 2019 - 2024. All rights reserved.