2016-06-07 16 views
1

ich eine SQL-Abfrage in Access 2010 mit Tabellen zu einem Pervasive Client von ODBC verknüpft zu schreiben. Wenn ich die Tabellen öffne, funktioniert die ODBC-Verbindung gut und zeigt mir die Werte in der Tabelle an. Die Abfrage besteht aus einer Reihe von Abfragen, die UNION ALL verwenden, um sie zusammenzuführen. Vor kurzem habe ich einen anderen UNION ALL-Abfrage und diese Störung erhalte:Warum erhalte ich eine ODBC-Verbindung Fehler fehlgeschlagen, wenn UNION ALL in Access?

enter image description here

Wenn ich jeden Teil der Abfrage separat laufen, es läuft gut. Die Abfrage, die ich über UNION ALL verbinde, hat genau die gleiche Anzahl von Feldern. Tatsächlich ist die neue Abfrage bis auf einen Teil der where-Klausel nahezu identisch. Kann jemand erklären, warum das nicht funktioniert?

Hier ist die Abfrage, die nicht funktioniert:

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

Wenn ich sie laufen getrennt, gibt es keinen Fehler:

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

Ich habe UNION ALL zu anderen Abfragen verwendet und sie funktionieren auch:

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

Ich habe versucht, auch die Art der Abfrage zu einer Pass-Through-Abfrage zu ändern, aber ich habe noch erhalten die ODBC - Anruf fehlgeschlagen Nachricht.

Was geht hier vor? Warum würden zu separate Abfragen, die separat ausgeführt werden, einen ODBC-Fehler generieren, wenn sie nicht gemeinsam verwendet werden? Und wie kann ich das beheben, damit es läuft?

+0

können relevant sein: http://stackoverflow.com/questions/13177354/union-query-access-on-an-interbase-db –

+0

Dank. Ich habe das selbst gefunden. Ich habe alles versucht, aber ich kann nicht herausfinden, warum meins nicht funktioniert, da jeder Teil der Abfrage separat funktioniert. – boilers222

+0

Haben Sie die UNION ALL-Abfrage über das Pervasive Control Center oder ein anderes ODBC-Tool ausgeführt? Funktioniert es oder gibt es einen Fehler? – mirtheil

Antwort

1

Ich weiß nicht, für bestimmte, aber ich kann fragen, nicht helfen, ob es um die Verwendung von MEMO als Spaltenname bezieht, da MEMO ist tatsächlich ein MS Access Datentyp; Logisch ist das egal, aber mit Access weiß man es nie.

jedoch, wie dem auch sei, Ihre Abfrage keine UNION ALL braucht und kann wie folgt geschrieben werden:

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

Bei Fragen ist es gute Praxis Alias-Tabellen, wie ich hier getan habe , da es macht Abfragen einfacher zu verstehen, und in der Regel Zeilenumbrüche hinzufügen, wie ich hier habe, einen Antworter ermöglichen Code an anderer Stelle zu kopieren - ich aufgrund des Fehlen von Zeilenumbrüchen in ihm einige Probleme kopieren sie den Code hatte. Diese Abfrage wird möglicherweise schneller ausgeführt, wenn pr_inp in der from-Klausel durch eine Unterabfrage ersetzt wurde, um nur diejenigen Zeilen in pr_inp zurückzugeben, die Sie betreffen (die where-Klausel in die Unterabfrage verschieben). ZB

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

Paar Dinge für die Fehlersuche, um zu versuchen:

Ich sah nur @John Bingham erwähnen MEMO ... aber ich werde meine Kommentare sowieso enthalten.

MEMO ist ein reserviertes Wort in Access - ich bezweifle, dass werde ein ODBC-Fehler verursachen, aber wenn Sie wirklich die Feldnamen benötigen, vielleicht wrapping „MEMO“ in eckigen Klammern versuchen.Sie verwenden es in der Abfrage, die Sie sagen, funktioniert - so bin ich mir nicht sicher, ob das das Problem ist.

Funktioniert die Abfrage, wenn Sie zwei separate Abfragen erstellen und UNION ALL mit den beiden Abfragen verwenden?