Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Access SQL语法错误:缺少运算符_Sql_Ms Access_Syntax Error - Fatal编程技术网

Access SQL语法错误:缺少运算符

Access SQL语法错误:缺少运算符,sql,ms-access,syntax-error,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, I

我正在尝试将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
我已经回顾了MS Access SQL和T-SQL在和其他几个位置之间的差异,但运气不好

感谢所有的帮助

更新:我删除了许多行,试图找到语法错误,但在运行时仍然会遇到相同的错误(使用T-SQL运行良好):


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

为什么要使用
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个括号关闭。我想您的查询中有一些错误,第一个(更重要)

为什么要使用
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的数据库中都应该失败:

  • 您在
    groupby
    中的表中有字段,而在
    from
    JOIN
    子句中没有引用

  • SELECT
    query中的字段数与
    INSERT-INTO
    子句中的字段数不匹配

  • MyParameterSettings表未正确与表达式上的有效
    联接

  • 严格MS Access SQL项目:

  • 对于多个联接,MS Access SQL需要成对的括号,但如果将某些表联接在一起,并且它们的成对结果联接到外部(即嵌套联接的位置),则即使这样也会变得棘手

  • WHERE
    子句中必须使用类似于
    ON 1=1
    的表达式,对于MyParameterSettings显示的交叉联接表,请使用逗号分隔的表

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

  • 下面是对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的数据库中也应失败:

  • 您在
    groupby
    中的表中有字段,而在
    from
    JOIN
    子句中没有引用

  • SELECT
    query中的字段数与
    INSERT-INTO
    子句中的字段数不匹配

  • MyParameterSettings表未正确与表达式上的有效
    联接

  • 严格MS Access SQL项目:

  • 对于多个联接,MS Access SQL需要成对的括号,但如果将某些表联接在一起,并且它们的成对结果联接到外部(即嵌套联接的位置),则即使这样也会变得棘手

  • WHERE
    子句中必须使用类似于
    ON 1=1
    的表达式,对于MyParameterSettings显示的交叉联接表,请使用逗号分隔的表

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

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

    请在
    HAVING
    语句中填写错误是否缺少最后一个括号?@MarkC。还有一个额外的右括号,很好的捕捉。@peggy请重新发布您的查询。
    1=1apply]
    怎么了?@peggy您在1=1.ProdClass上还有
    MyParameterSettings。请发布错误您在
    HAVING
    语句中缺少最后一个括号了吗?@MarkC。还有一个额外的右括号,很好的捕捉。@peggy请重新发布您的查询。
    1=1apply]
    怎么了?@peggy您在1=1.ProdClass上还有
    MyParameterSettings。查询在sql中使用having子句可以正常工作。添加了一个右括号,但在查询表达式'IndvMast.IndvID=OHdrMast.IndvID....中仍然出现
    语法错误(缺少运算符)[SalesTerritoryFilter\u检查所有适用项].SalesTer'
    查询在sql中使用having子句可以正常工作。添加了一个右括号,但在查询表达式'IndvMast.IndvID=OHdrMast.IndvID....中仍然出现
    语法错误(缺少运算符)[SalesTerritoryFilter\u检查所有适用项].SalesTer'