Access SQL Syntax error: missing operator

Access SQL Syntax error: missing operator

我正在尝试将 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

我想你的查询有一些错误,第一个(更重要)。

为什么要使用 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 个括号

您的查询中有许多项目在任何 SQL-compliant 数据库中也应该失败:

  1. GROUP BY 中 table 的字段未在 FROMJOIN 子句中引用。

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

  3. MyParameterSettings table 未正确加入有效的 ON 表达式。

严格 MS Access SQL 项:

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

  2. 必须在 WHERE 子句中使用 ON 1=1 等表达式,并且对于交叉连接 tables 作为 MyParameterSettings 出现是,使用 comma-separated tables.

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

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

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 子集中,最后一个 table 不需要 ON 1=1 条件并且在 SQL 服务器中也可能是多余的。如果您打算进行交叉连接,只需用逗号分隔 table 就足够了。在上面的例子中也是如此:

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