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

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

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

您需要的是将两个表中LEFT列中的Answers的{​​{1}}与Users的{​​{1}}连接起来。
这意味着即使ON中没有匹配项,也将返回UserName的所有行。
但是,还有另一个问题:在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
本文链接:https://www.f2er.com/2803813.html

大家都在问