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

如果我单独运行查询的每个部分,它运行得很好。我通过UNION ALL连接的查询具有完全相同数量的字段。事实上,除了where子句的一部分之外,新的查询几乎相同。有人能解释一下为什么这个不起作用吗?
下面是不起作用的查询:
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')如果我单独运行它们,则不会出现错误:
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')

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用于其他查询,它们也可以很好地工作:
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错误?我该如何修复它才能运行呢?
发布于 2016-06-08 10:11:25
我不确定,但我不禁想知道这是否与MEMO用作列名有关,因为MEMO实际上是一种ms access数据类型;从逻辑上讲,这不应该有什么关系,但对于Access,人们永远不会知道。
然而,尽管如此,您的查询不需要UNION ALL,可以编写如下代码:
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子句移入子查询),则此查询的运行速度可能会更快。例如
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')发布于 2016-06-08 11:22:56
尝试进行故障排除的几件事:
我刚看到@John Bingham也提到了备忘录...但不管怎样,我还是会写下我的评论。
MEMO是Access中的保留字-我怀疑这会导致ODBC错误,但如果您确实需要字段名,也许可以尝试将"MEMO“括在方括号中。您确实在您所说的有效的查询中使用了它-所以我不确定这是否是问题所在。
如果您创建两个单独的查询并对这两个查询使用UNION ALL,那么该查询是否有效?
https://stackoverflow.com/questions/37683236
复制相似问题