访问SQL语法错误:缺少运算符

时间:2017-01-11 15:53:42

标签: sql ms-access syntax-error

我正在尝试将T-SQL查询转换为MS Access SQL并获取我难以找到的语法错误。我的MS Access SQL查询如下所示:

INSERT INTO IndvRFM_PreSort (CustNum, IndvID, IndvRScore, IndRecency, IndvFreq, IndvMonVal )
    SELECT 
        IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
        IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal
    FROM 
        IndvMast 
    INNER JOIN 
        OHdrMast ON IndvMast.IndvID = OHdrMast.IndvID 
    INNER JOIN 
        MyParameterSettings on 1=1].ProdClass
    INNER JOIN 
        [SalesTerritoryFilter_Check all that apply] ON IndvMast.SalesTerr = [SalesTerritoryFilter_Check all that apply].SalesTerr
    WHERE 
        (((OHdrMast.OrdDate) >= [MyParameterSettings].[RFM_StartDate]))
    GROUP BY 
        IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
        IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal, 
        [CustTypeFilter_Check all that apply].IncludeInRFM, 
        [ProductClassFilter_Check all that apply].IncludeInRFM, 
        [SourceCodeFilter_Check all that apply].IncludeInRFM, 
        IndvMast.FlgDontUse

我已经审核了http://rogersaccessblog.blogspot.com/2013/05/what-are-differences-between-access-sql.html和其他一些地方的MS Access SQL和T-SQL之间的差异,但没有运气。

感谢所有帮助。

更新:我已经删除了很多行试图找到语法错​​误,我在运行时仍然遇到相同的错误(使用T-SQL运行正常):

SELECT 
    IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
    IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal
FROM 
    IndvMast 
INNER JOIN 
     OHdrMast  ON IndvMast.IndvID = OHdrMast.IndvID    
INNER JOIN 
     [My Parameter Settings] ON 1 = 1

2 个答案:

答案 0 :(得分:1)

我认为您的查询中存在一些错误,第一个错误(更重要)。

为什么使用HAVING子句来添加这些条件?

HAVING (((IndvMast.IndRecency)>(date()-7200))
AND (([CustTypeFilter_Check all that apply].IncludeInRFM)=1)
AND (([ProductClassFilter_Check all that apply].IncludeInRFM)=1)
AND (([SourceCodeFilter_Check all that apply].IncludeInRFM)=1)
AND ((IndvMast.FlgDontUse) Is Null))

HAVING通常用于聚合函数的条件(COUNT,SUM,MAX,MIN,AVG),用于标量值,必须放入WHERE子句。

第二种:您在HAVING子句中打开了12个括号并关闭了11个

答案 1 :(得分:1)

您的查询中有许多项目在任何符合SQL的数据库中都应该失败:

  1. GROUP BYFROM条款中未提及JOIN中的表格中的字段。

  2. SELECT查询中的字段数与INSERT INTO子句中的字段数不匹配。

  3. MyParameterSettings 表未与有效的ON表达式正确连接。

  4. 严格MS Access SQL项目:

    1. 对于多个连接,MS Access SQL需要成对的括号,但如果某些表连接在一起并且它们的配对结果连接到您获得嵌套连接的外部,即使这样也会变得棘手。

    2. ON 1=1子句中必须使用WHERE等表达式,而 MyParameterSettings 似乎是交叉连接表,使用逗号分隔表。

    3. 由于上述原因以及更多原因,建议此SQL方言的初学者使用“查询设计”构建器提供表格图表和链接(如果您当前拥有MS Access GUI .exe)。然后,一旦所有表以图形方式连接至少一个选定的字段,跳转到SQL视图以获取任何细微差别的脚本逻辑。

    4. 下面是对SQL语句的调整,以演示括号配对和最佳实践,使用表别名,尤其是长表名。

      INSERT INTO IndvRFM_PreSort (CustNum, IndvID, IndvRScore, IndRecency, IndvFreq, IndvMonVal)
      
      SELECT 
          i.CustNum, i.IndvID, i.IndvRScore, i.IndRecency, i.IndvFreq, i.IndvMonVal
      FROM 
          [MyParameterSettings] p, (IndvMast i
      INNER JOIN 
          OHdrMast o ON i.IndvID = o.IndvID) 
      INNER JOIN 
          [SalesTerritoryFilter_Check all that apply] s ON i.SalesTerr = s.SalesTerr
      WHERE 
          (o.OrdDate >= p.[RFM_StartDate])
      GROUP BY 
          i.CustNum, i.IndvID, i.IndvRScore, i.IndRecency, i.IndvFreq, i.IndvMonVal
      

      在较小的SQL子集中,最后一个表不需要ON 1=1条件,并且在SQL Server中也可能是冗余的。如果您打算进行交叉连接,只需使用逗号分隔表即可。在上面的例子中做了同样的事情:

      SELECT  
          IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
          IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal
      FROM 
          [My Parameter Settings], IndvMast
      INNER JOIN 
           OHdrMast ON IndvMast.IndvID = OHdrMast.IndvID