我已经开发了一种SQL查询,该查询使用基于结果集的子查询(即查询查询子查询的结果)。该查询将在MS Access中按预期执行,但不会在vb.net(包括查询生成器)中执行。我在查询生成器中收到的错误是:
“ ORDER”附近的WHERE子句中的错误。无法解析查询文本。
我知道典型的子查询是基于WHERE
子句进行选择的,而我的SQL是基于FROM
子句进行查询的。由于Access不支持LIMIT
命令,因此我无法弄清楚此SQL的结构,以便它可以在VB.NET中运行。如果支持LIMIT
命令,我认为我可以正确构造子查询。
这是我的SQL:
SELECT AVG(Differential) * .96
FROM
(SELECT TOP 5 Differential
FROM
(SELECT TOP 10 GameDate, Differential
FROM ScoringHistory
WHERE PlayerID = ?
ORDER BY GameDate DESC)
ORDER BY Differential ASC, GameDate DESC)
如果我将PlayerID = ?
更改为PlayerID = 1
(这是一个有效值),则查询构建器会给出与上述相同的错误,但我可以在查询构建器中执行查询。
我还尝试过将Access中的查询导入(?
到VB.NET中,但出现相同的错误。
关于如何构造查询以使其正确执行的任何建议?
添加更多信息:
我正在通过表适配器实现。见图片。 Selecting the query and clicking configure displays the following
然后,如果我单击“查询生成器”按钮,则会出现此错误: Error Message
我实现查询的代码如下:
Dim factor As Single
factor = ScoringHistoryTableAdapter.CalculateFactor(1)
答案 0 :(得分:0)
我认为您缺少别名或子查询
SELECT AVG(Differential) * .96
FROM
(SELECT TOP 5 Differential
FROM
(SELECT TOP 10 GameDate, Differential
FROM ScoringHistory
WHERE PlayerID = 1
ORDER BY GameDate DESC) a
ORDER BY Differential ASC, GameDate DESC) b
答案 1 :(得分:0)
看起来您的OrderBy子句是相反的。
您要通过GameDate在中间的From子句中进行排序,但GameDate不包括在该Select中,而仅包括差异。
尝试:
SELECT AVG(Differential) * .96
FROM (
SELECT TOP 5 Differential
FROM (
SELECT TOP 10 GameDate, Differential
FROM ScoringHistory
WHERE PlayerID = ?
ORDER BY Differential ASC,GameDate DESC
)
ORDER BY Differential DESC
)
答案 2 :(得分:0)
作为原始海报,我想我会为所有人关闭循环。
更多研究表明,这是子查询和表适配器向导的已知问题(?)。现在知道了这一点,我学会了如何以老式方式执行SQL并按照Charles的指示使用ExecuteScalar,并且SQL可以正常工作。