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