sql - Access SQL语法错误: missing operator

标签 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

最佳答案

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

  • 您有GROUP BYFROM子句中未引用的JOIN中的表中的字段。
  • SELECT查询中的字段数与INSERT INTO子句中的字段数不匹配。
  • MyParameterSettings表未与有效的ON表达式正确连接。

  • 严格的MS Access SQL项目:
  • 对于多个联接,MS Access SQL要求使用成对的括号,但是如果将某些表联接在一起并且它们的成对结果联接到外部(您将获得嵌套联接),这甚至会变得棘手。
  • 必须在ON 1=1子句中使用像WHERE这样的表达式,并且对于交叉连接表,因为MyParameterSettings看起来像这样,请使用逗号分隔的表。
  • 由于上述原因及更多原因,建议该SQL方言的初学者使用提供表图和链接的“查询设计”构建器(如果您当然具有MS Access GUI .exe)。然后,一旦所有表以图形方式连接且至少选择了一个字段,则跳至SQL View 以获取任何细微的脚本逻辑。

  • 下面是对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
    

    关于sql - Access SQL语法错误: missing operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41595233/

    相关文章:

    sql-server - 将 MS ACCESS 查询转换为 SQL Server 查询

    java - 错误 : java. sql.SQLException : [Microsoft][ODBC dBASE Driver] Too few parameters. 预期 1

    c++ - LibCurl CURLOPT_URL 不接受字符串? C++

    MySQL插入语句语法?

    compiler-construction - 使用ifort 11.0编译时出现语法错误

    sql - 在包含数百万行的表上创建索引会导致任何问题吗?在实时生产数据库中做同样的事情是否存在危险?

    sql - 无效,因为它不包含在聚合函数或 group by 子句中

    sql - V$SQL 中 SQL 语句的计划哈希值为 "0"

    sql - IN 谓词在 SQL 中如何工作?

    javascript - 在 JavaScript 中通过 ADODB 从 Access DB 构建 HTML 表