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