使用到MYSQL的ODBC连接在MS Access中运行SQL时出错

使用到MYSQL的ODBC连接在MS Access中运行SQL时出错,mysql,ms-access,odbc,driver,Mysql,Ms Access,Odbc,Driver,我正在帮助一家非营利机构将MS Access数据迁移到MYSQL。因此,我将数据移植到MYSQL,并使用ODBC在ms access中创建了到MYSQL表的链接。大多数现有SQL都可以正常工作。然而,我被这一错误难住了- 您的SQL语法有错误,请检查与您的MySQL服务器版本对应的手册,以了解使用near UNION的正确语法 我已经将SQL与7个联合剥离到了仍然失败的地方 (SELECT 1 as A FROM Households H) UNION ALL (SELECT 2 as A FR

我正在帮助一家非营利机构将MS Access数据迁移到MYSQL。因此,我将数据移植到MYSQL,并使用ODBC在ms access中创建了到MYSQL表的链接。大多数现有SQL都可以正常工作。然而,我被这一错误难住了-

您的SQL语法有错误,请检查与您的MySQL服务器版本对应的手册,以了解使用near UNION的正确语法

我已经将SQL与7个联合剥离到了仍然失败的地方

(SELECT 1 as A FROM Households H)
UNION ALL
(SELECT 2 as A FROM Households H)
UNION ALL
(SELECT 3 as A FROM Households H)
让我感到困惑的是,只要我只运行一个UNION,即SQL以下的UNION,我就能够成功地在上面运行,但当我添加第三个UNION时,就会出现ODBC错误

(SELECT 1 as A FROM Households H)
UNION ALL
(SELECT 2 as A FROM Households H)
我试着使用`'[],但这些都没用。我对这个错误感到沮丧的原因是,它要么失败,要么失败,只有在使用两个或多个UNION子句时才会出现错误。这可能是驱动程序中的一个潜在错误吗

我在win-7 64位上使用mysql-64位,带有ms access和32位驱动程序。这不应该是架构问题,因为我能够使用多个联合运行其他查询,并访问同一组表


如果有人能给出如何进一步调试的建议,那就太好了。

在我的Access版本中,当我在Design(SQL)视图中编辑查询时,顶部有三个按钮。“联合”、“传递”和“数据定义”

如果我单击“通过”,您的查询将正常工作。如果我单击“联合”,它将断开。您可以使用“传递”来进行此查询吗

即使在“联合”或“数据定义”模式下,这似乎也能起作用:

(SELECT 1, column1 as A FROM Households H)
UNION ALL
(SELECT 2, column2 as A FROM Households H)
UNION ALL
(SELECT 3, column3 as A FROM Households H);
也许只有一列会混淆访问

或者,只需使用多路复用表而不是联合:

SELECT mux.id,
IIf(mux.id=1,column1,IIf(mux.id=2,column2,column3)) AS A
FROM Households, mux;

注:mux表中应有3个值1,2,3。如果它有更多的内容,您可能希望将where子句中的前3个(或n个)限制在其中

这是一个已知的MySQL问题:但我不知道问题是在MSAccess SQL解析器(编译为ODBC SQL)中,还是在MySQL ODBC驱动程序(编译ODBC SQL为MySQL SQL)中

要解决这个问题,我必须查看ODBC日志和ODBC规范,看看Access是否匹配有效的ODBC SQL


这将是一种浪费,因为无论如何使用传递查询更有意义。在这里使用本机MSAccess查询的主要原因是连接到不同的数据源,例如Excel电子表格和MySQL表,根据MySQL错误报告上的评论,当您这样做时,问题就消失了。

我不确定问题出在哪里,但我认为(虽然这只是一个假设)这是在MS Access端。我有两个
UNION
查询,每个查询都将一些其他查询放在一起。它们都使用了一些复杂的子查询,因此我在创建传递查询时遇到了很多问题,我不想使用MySQL“视图”

令人惊讶的是,我的一个查询成功了,另一个显示了一个错误。我的想法是,工作查询使用了一些访问功能,而另一个是某种
SELECT…FROM

我不知道规则,但我认为当您的查询很简单时,Access会将其发送到外部数据库引擎并加上一个括号,从而导致错误。如果您执行复杂的查询,Access会获取它需要的所有数据,并自行进行所有必要的操作。例如,您可以尝试创建一个使用MSSQL
TRANSFORM语句,它在MySQL中不存在,所以很明显Access自己处理它。那么为什么它不能自己进行
SELECT
?我不知道。可能是性能原因吧

我的工作查询与另一个不同,它还有一个由内置访问函数计算的(字符串)字段。它还使用Access
&
运算符,在MySQL中具有另一个含义(逻辑AND)。(顺便在MySQL中连接字符串使用
CONCAT
函数)。它们当然需要通过Access进行评估,因为MySQL不理解这种将字符串连接在一起的方法

我建议不要从表中创建
UNION
,而是从查询中创建(如
SELECT*fromtablename
等等),并为它们提供一个您不需要的字段,但这将强制Access处理查询。因此,(Access中的)查询应如下所示:

SELECT tablename.*, [somefield1]&[somefield2] AS useless_field FROM tablename;
(在我的Access 2000操作中,像
“a”和“b”
IIf(true;true;false)
可能被简化和解决了,所以它不起作用。我认为至少需要一个动态字段来评估。我也没有做性能测试。如果你把整数加起来,可能会最快,也许只是把索引增加1?)

然后,当然,你把它连接在一起:

SELECT * FROM query1
UNION ALL
SELECT * FROM query2
UNION ALL
SELECT * FROM query3
UNION ALL

当然,您不需要这个
无用的\u字段


我同意这是一种解决方法,但我没有其他想法。

原始查询是否从常规(非ODBC)MySQL客户端运行?包装是否选择*(…)正如foo所说的帮助?注意:A、B、C让我感到奇怪,因为它没有任何用处……原始SQL在MS Access前端访问MS Access后端时运行良好。原始SQL中有一个Dateadd函数,因此我将其移植到了MYSQL,并能够直接在MYSQL中运行查询。问题是我无法使用MYSQL语法对于用ms access编码的查询,我必须按原样使用原始查询。我曾尝试选择HouseholdID,它在家庭中是PK,但仍然出现相同的错误。对于常规的非odbc客户端,我指的是命令行mysql工具、HeidiSQL或类似工具。我非常确定Microsoft access通过odbc连接。我记不清h是什么当我将UNION更改为Pass thru时出现。今晚我将对此进行一次尝试,并让您知道。谢谢!好的,我读了更多关于Pass THRUP的内容。这意味着SQL将在服务器上执行(本例中为mysql)
SELECT * FROM queryn
;