我正在尝试将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
答案 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的数据库中都应该失败:
GROUP BY
或FROM
条款中未提及JOIN
中的表格中的字段。
SELECT
查询中的字段数与INSERT INTO
子句中的字段数不匹配。
MyParameterSettings 表未与有效的ON
表达式正确连接。
严格MS Access SQL项目:
对于多个连接,MS Access SQL需要成对的括号,但如果某些表连接在一起并且它们的配对结果连接到您获得嵌套连接的外部,即使这样也会变得棘手。
ON 1=1
子句中必须使用WHERE
等表达式,而 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