2016-06-07 56 views
1

我在Access 2010中编写SQL查询,并通过ODBC将表链接到Pervasive客户端。当我打开表格时,ODBC连接正常工作,并向我显示表格中的值。该查询是使用UNION ALL将它们合并在一起的一系列查询。最近,我又增加了UNION ALL查询并正在此错误:在Access中使用UNION ALL时,为什么会出现ODBC连接失败错误?

enter image description here

如果我单独运行查询的每一部分,它运行良好。我通过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') 

enter image description here

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

enter image description here

我使用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') 

enter image description here

我也试图改变查询到直通查询的类型,但我仍然得到ODBC - 调用失败消息。

这是怎么回事?为什么分开运行的查询在联合在一起时会生成ODBC错误?以及如何解决这个问题,让它运行?

+0

可能是相关的:http://stackoverflow.com/questions/13177354/union-query-access-on-an-interbase-db –

+0

谢谢。我其实发现自己发布。我尝试了一切,但不知道为什么我的工作不起作用,因为查询的每个部分都是分开工作的。 – boilers222

+0

您是否通过Pervasive Control Center或其他ODBC工具运行了UNION ALL查询?它工作还是会出错? – mirtheil

回答

1

我不确定,但我不禁想知道它是否与使用MEMO作为列名相关,因为MEMO实际上是一个ms访问数据类型;从逻辑上讲,这应该不重要,但是对于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') 
0

几件事情要尝试排除故障:

我刚看到@约翰宾汉姆提MEMO太...但我反正包括我的意见。

MEMO是Access中的一个保留字 - 我怀疑这会导致ODBC错误,但如果您真的需要字段名,也许尝试在方括号中包装“备忘录”。你确实在你说的作品中使用它 - 所以我不确定这是否是问题。

如果您创建两个单独的查询并将UNION ALL用于两个查询,查询是否可以工作?

相关问题