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
连接 Answers
到 Users
基于 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
我正在 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
连接 Answers
到 Users
基于 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