首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Access中使用UNION ALL时,为什么会出现ODBC连接失败错误?

在Access中使用UNION ALL时,为什么会出现ODBC连接失败错误?
EN

Stack Overflow用户
提问于 2016-06-07 23:16:19
回答 2查看 1.1K关注 0票数 1

我正在用Access 2010编写一个SQL查询,其中包含通过ODBC链接到普适客户端的表。当我打开这些表时,ODBC连接工作正常,并向我显示表中的值。该查询是一系列使用UNION ALL将它们合并在一起的查询。最近,我添加了另一个UNION ALL查询,并收到以下错误:

如果我单独运行查询的每个部分,它运行得很好。我通过UNION ALL连接的查询具有完全相同数量的字段。事实上,除了where子句的一部分之外,新的查询几乎相同。有人能解释一下为什么这个不起作用吗?

下面是不起作用的查询:

代码语言:javascript
复制
SELECT SUM(PR_INP.Futa_5) + SUM(PR_SUTA.Amt_10) AS AMT, '67360' AS DEPT, CDATE(PaidOn) AS PayDate, 'ER Tax Exp:  FUTA/SUTA - Dept 10, 11, 12' AS Memo FROM PR_INP INNER JOIN PR_SUTA ON PR_SUTA.Loc_No = PR_INP.Loc_No AND PR_SUTA.Div_No = PR_INP.Div_No AND PR_SUTA.Emp_No = PR_INP.Emp_No AND PR_SUTA.Pay_Date = PR_INP.Pay_Date WHERE PR_INP.Loc_No = 2170 AND PR_INP.Div_No = 100 AND PR_INP.Pay_Date = CDATE(PaidOn) AND Def_Dept IN ('010', '011', '012')
UNION ALL
SELECT SUM(PR_INP.Futa_5) + SUM(PR_SUTA.Amt_10) AS AMT, '66360' AS DEPT, CDATE(PaidOn) AS PayDate, 'ER Tax Exp:  FUTA/SUTA - Dept 13' AS Memo FROM PR_INP INNER JOIN PR_SUTA ON PR_SUTA.Loc_No = PR_INP.Loc_No AND PR_SUTA.Div_No = PR_INP.Div_No AND PR_SUTA.Emp_No = PR_INP.Emp_No AND PR_SUTA.Pay_Date = PR_INP.Pay_Date WHERE PR_INP.Loc_No = 2170 AND PR_INP.Div_No = 100 AND PR_INP.Pay_Date = CDATE(PaidOn) AND Def_Dept IN ('013')

如果我单独运行它们,则不会出现错误:

代码语言:javascript
复制
SELECT SUM(PR_INP.Futa_5) + SUM(PR_SUTA.Amt_10) AS AMT, '67360' AS DEPT, CDATE(PaidOn) AS PayDate, 'ER Tax Exp:  FUTA/SUTA - Dept 10, 11, 12' AS Memo     FROM PR_INP INNER JOIN PR_SUTA ON PR_SUTA.Loc_No = PR_INP.Loc_No AND PR_SUTA.Div_No = PR_INP.Div_No AND PR_SUTA.Emp_No = PR_INP.Emp_No AND PR_SUTA.Pay_Date = PR_INP.Pay_Date WHERE PR_INP.Loc_No = 2170 AND PR_INP.Div_No = 100 AND PR_INP.Pay_Date = CDATE(PaidOn) AND Def_Dept IN ('010', '011', '012')

代码语言:javascript
复制
SELECT SUM(PR_INP.Futa_5) + SUM(PR_SUTA.Amt_10) AS AMT, '66360' AS DEPT, CDATE(PaidOn) AS PayDate, 'ER Tax Exp:  FUTA/SUTA - Dept 13' AS Memo FROM PR_INP INNER JOIN PR_SUTA ON PR_SUTA.Loc_No = PR_INP.Loc_No AND PR_SUTA.Div_No = PR_INP.Div_No AND PR_SUTA.Emp_No = PR_INP.Emp_No AND PR_SUTA.Pay_Date = PR_INP.Pay_Date WHERE PR_INP.Loc_No = 2170 AND PR_INP.Div_No = 100 AND PR_INP.Pay_Date = CDATE(PaidOn) AND Def_Dept IN ('013')

我已经将UNION ALL用于其他查询,它们也可以很好地工作:

代码语言:javascript
复制
SELECT SUM(PR_INP.Futa_5) + SUM(PR_SUTA.Amt_10) AS AMT, '67360' AS DEPT, CDATE(PaidOn) AS PayDate, 'ER Tax Exp:  FUTA/SUTA - Dept 10, 11, 12' AS Memo FROM PR_INP INNER JOIN PR_SUTA ON PR_SUTA.Loc_No = PR_INP.Loc_No AND PR_SUTA.Div_No = PR_INP.Div_No AND PR_SUTA.Emp_No = PR_INP.Emp_No AND PR_SUTA.Pay_Date = PR_INP.Pay_Date WHERE PR_INP.Loc_No = 2170 AND PR_INP.Div_No = 100 AND PR_INP.Pay_Date = CDATE(PaidOn) AND Def_Dept IN ('010', '011', '012')
UNION ALL
SELECT SUM(Fica_5 + IIF(PR_MAST.Gross_Yr >= 200000.00, Medc_6, Medc_5) ), '63330', CDATE(PaidOn), 'ER Tax Exp: Federal, SS, Medicare- Dept 5, 6' FROM PR_INP INNER JOIN PR_MAST ON PR_MAST.Loc_No = PR_INP.Loc_No AND PR_Mast.Emp_No = PR_INP.Emp_No WHERE PR_INP.Loc_No = 2170 AND PR_INP.Div_No = 100 AND Pay_Date = CDATE(PaidOn) AND PR_INP.Def_Dept IN ('005', '006')

我还尝试将查询类型更改为直通查询,但仍然收到ODBC--call failed消息。

这里发生了什么事?为什么单独运行的查询在联合在一起时会生成ODBC错误?我该如何修复它才能运行呢?

EN

回答 2

Stack Overflow用户

发布于 2016-06-08 10:11:25

我不确定,但我不禁想知道这是否与MEMO用作列名有关,因为MEMO实际上是一种ms access数据类型;从逻辑上讲,这不应该有什么关系,但对于Access,人们永远不会知道。

然而,尽管如此,您的查询不需要UNION ALL,可以编写如下代码:

代码语言:javascript
复制
SELECT Sum(p.Futa_5) + Sum(s.Amt_10) as AMT, 
    iif(Def_Dept = '013', '66360', '67360') as DEPT, CDate(PaidOn) as PayDate, 
    'ER Tax Exp: FUTA/SUTA - Dept ' & iif(Def_Dept = '013', '13', '10, 11, 12') as [Memo]
FROM pr_inp p INNER JOIN pr_suta s ON p.Loc_No = s.Loc_No AND p.Div_No = s.Div_No 
    AND p.Emp_No = s.Emp_No AND p.Pay_Date = s.Pay_Date
WHERE p.Loc_No = 2170 AND p.Div_No = 100 AND p.Pay_Date = CDate(PaidOn) 
    AND Def_Dept IN ('010', '011', '012', '013')

在提问时,像我在这里所做的那样给表起别名是一个很好的做法,因为它使查询更容易理解,并且通常像我在这里所做的那样添加换行符,以使回答者能够将您的代码复制到其他地方-由于其中没有换行符,我在复制您的代码时遇到了一些问题。

如果将from子句中的pr_inp替换为子查询,以便仅返回pr_inp中您关心的那些行(将where子句移入子查询),则此查询的运行速度可能会更快。例如

代码语言:javascript
复制
SELECT (as above)
FROM (SELECT * FROM pr_inp WHERE Loc_No = 2170 AND Div_No = 100) p
    INNER JOIN (as above)
WHERE p.Pay_Date = CDate(PaidOn) AND Def_Dept IN ('010', '011', '012', '013')
票数 1
EN

Stack Overflow用户

发布于 2016-06-08 11:22:56

尝试进行故障排除的几件事:

我刚看到@John Bingham也提到了备忘录...但不管怎样,我还是会写下我的评论。

MEMO是Access中的保留字-我怀疑这会导致ODBC错误,但如果您确实需要字段名,也许可以尝试将"MEMO“括在方括号中。您确实在您所说的有效的查询中使用了它-所以我不确定这是否是问题所在。

如果您创建两个单独的查询并对这两个查询使用UNION ALL,那么该查询是否有效?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37683236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档