1

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

您的 SQL 语法有错误,请检查与您的 MySQL 服务器版本相对应的手册,以便在 UNION 附近使用正确的语法...

我已经将带有 7 个 UNIONS 的 SQL 剥离到它仍然失败的地方。

(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)

对我来说,只要我在 SQL 下面只运行一个 UNION 含义,我就能够成功运行,但是当我添加第三个 UNION 时,它会给出 ODBC 错误

(SELECT 1 as A FROM Households H)
UNION ALL
(SELECT 2 as A FROM Households H)

我尝试使用` or '[]但这些都没有帮助。我对这个错误感到沮丧的原因是它要么全部失败,要么全部失败,只有在使用两个或多个 UNION 子句时才会出错。这可能是驱动程序中的潜在错误吗?

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

如果有人可以提供有关如何进一步调试的指示,那就太好了。

4

3 回答 3

1

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

如果我单击“传递”,则您的查询有效。如果我单击“联合”它会中断。你可以在这个查询中使用“Pass-Through”吗?

即使在“联合”或“数据定义”模式下,这似乎也有效:

(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);

也许 Access 只被一列搞糊涂了?

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

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 个)。

于 2013-01-02T17:57:58.690 回答
1

这是一个已知的 MySQL 问题:两个以上 UNION SELECT 语句问题(使用 MS Access) ,但我不知道问题出在 MSAccess SQL 解析器(编译为 ODBC SQL)还是 MySQL ODBC 驱动程序(其中将 ODBC SQL 编译为 MySQL SQL)

为了解决这个问题,我必须查看 ODBC 日志和 ODBC 规范,并查看 Access 是否发出了有效的 ODBC SQL。

那将是浪费精力,因为无论如何使用传递查询更有意义。在这个地方使用本机 MSAccess 查询的主要原因是连接到不同的数据源 - 例如,Excel 电子表格和 MySQL 表 - 根据 MySQL 错误报告上的评论,当你去做。

于 2013-01-03T10:48:34.563 回答
0

我不确定问题出在哪里,但我认为(尽管这只是一个假设)这是在 MS Access 方面。我有两个UNION查询,每个查询都将其他查询放在一起。两者都使用了一些复杂的子查询,所以我在创建传递查询时遇到了很多问题,而且我不想使用 MySQL“视图”。

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

我不知道规则,但我认为当您的查询很简单时,Access 会将其发送到外部数据库引擎并再放置一个括号并导致错误。如果您执行复杂的查询,Access 会获取它需要的所有数据并自行执行所有必要的操作。例如,您可能会尝试创建一个使用 MSSQLTRANSFORM语句的数据透视查询,这在 MySQL 中不存在,因此很明显 Access 会自己处理它。那么为什么它不能自己制造SELECT呢?我不知道。也许是一些性能原因?

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

我建议UNION不要从表中创建,而是从查询中创建(SELECT * FROM tablename仅此而已),并为它们提供一个您不需要的字段,但这将强制 Access 处理查询。所以一个查询(在 Access 中)应该是这样的:

SELECT tablename.*, [somefield1]&[somefield2] AS useless_field FROM tablename;

(在我的 Access 2000 操作中,像"a" & "b"orIIf(true;true;false)可能被简化和解决了,所以它不起作用。我认为至少需要一个动态字段来评估。我也没有进行性能测试。如果你添加到整数可能会最快,也许只是将您的索引增加1?)。

然后,当然,你把它结合在一起:

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

...

SELECT * FROM queryn
;

你当然不需要这个useless_field

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

于 2013-02-22T22:08:59.070 回答