使用Access数据库的VB.Net中的SQL子查询

时间:2019-06-19 12:43:45

标签: sql vb.net ms-access

我已经开发了一种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)

3 个答案:

答案 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可以正常工作。