2010-12-31 8 views
1

Wenn ich versuche, diese Abfrage in Access über die ODBC-Schnittstelle in eine MySQL-Datenbank auszuführen, bekomme ich einen Fehler "Ausdruck zu komplex in Abfrageausdruck". Das Wesentliche, was ich versuche, ist es, abgekürzte Namen von Sprachen in ihre englischen Gegenstücke zu übersetzen. Ich war neugierig, ob es einen Weg gab, den Zugang zu "tricksen", um zu denken, dass der Ausdruck mit Unterabfragen kleiner ist, oder ob jemand anders eine bessere Vorstellung davon hatte, wie man dieses Problem lösen könnte. Ich habe darüber nachgedacht, eine temporäre Tabelle zu erstellen und einen Join durchzuführen, aber das wird in Access SQL nicht unterstützt.Ausdruck zu komplex in Access 2007

Nur als ein FYI, die Abfrage funktionierte gut, bis ich die große lange IFF-Kette hinzugefügt. Ich testete die Abfrage auf einer kleineren IFF-Kette für drei Sprachen, und das war kein Problem, so stammt das Problem definitiv von der großen IFF-Kette (Es ist 26 tief). Auch könnte ich in der Lage sein, einige der Optionen zu löschen (wie die verschiedenen Formen von Chinesisch oder Portugiesisch zu kombinieren)

Als Test konnte ich die SQL-Abfrage zu arbeiten, nachdem es auf 14 IFF() Aussagen, aber das ist weit entfernt von den 26 Sprachen, die ich darstellen möchte.

SELECT TOP 5 Count(*) AS [Number of visits by language], IIf(login.lang="ar","Arabic",IIf(login.lang="bg","Bulgarian",IIf(login.lang="zh_CN","Chinese (Simplified Han)",IIf(login.lang="zh_TW","Chinese (Traditional Han)",IIf(login.lang="cs","Czech",IIf(login.lang="da","Danish",IIf(login.lang="de","German",IIf(login.lang="en_US","United States English",IIf(login.lang="en_GB","British English",IIf(login.lang="es","Spanish",IIf(login.lang="fr","French",IIf(login.lang="el","Greek",IIf(login.lang="it","Italian",IIf(login.lang="ko","Korean",IIf(login.lang="hu","Hungarian",IIf(login.lang="nl","Dutch",IIf(login.lang="pl","Polish",IIf(login.lang="pt_PT","European Portuguese",IIf(login.lang="pt_BR","Brazilian Portuguese",IIf(login.lang="ru","Russian",IIf(login.lang="sk","Slovak",IIf(login.lang="sl","Slovenian","IIf(login.lang="fi","Finnish",IIf(login.lang="sv","Swedish",IIf(login.lang="tr","Turkish","Unknown")))))))))))))))))))))))))) AS [Language] 
FROM login, reservations, reservation_users, schedules 
WHERE (reservations.start_date Between DATEDIFF('s','1970-01-01 00:00:00',[Starting Date in the Following Format YYYY/MM/DD]) And DATEDIFF('s','1970-01-01 00:00:00',[Ending Date in the Following Format YYYY/MM/DD])) And reservations.is_blackout=0 And reservation_users.memberid=login.memberid And reservation_users.resid=reservations.resid And reservation_users.invited=0 And reservations.scheduleid=schedules.scheduleid And scheduletitle=[Schedule Title] 
GROUP BY login.lang 
ORDER BY Count(*) DESC; 

@ Michael Todd

bin ich völlig einverstanden. Die Liste der Sprachen sollte eine Tabelle in der Datenbank sein und die login.lang sollte ein FK in dieser Tabelle sein. Leider wurde die Datenbank nicht so geschrieben, und es ist nicht meine Aufgabe, sie zu modifizieren. Die Sprachen werden in das Feld login.lang gestellt, indem PHP über der Datenbank läuft.

+2

Warum nicht einfach eine Nachschlagetabelle mit den Sprachwerten verwenden und dann in Ihre Abfrage aufnehmen? Es muss keine temporäre Tabelle sein (eigentlich sollte es eine permanente sein). –

+1

Ich stimme Michael Todd vollkommen zu. Es sollte in der Tat sehr einfach sein, eine Tabelle mit Sprachkürzel und vollem Namen einzurichten. – Fionnuala

Antwort

1

Ich dachte darüber nach, eine temporäre Tabelle zu erstellen und einen Join durchzuführen, aber das wird in Access SQL nicht unterstützt.

Haben Sie versucht, in Access eine Tabelle mit Sprachen zu erstellen und sie mit den MySQL-Tabellen zu verknüpfen?

+0

Gerade heute, und ja, das hat perfekt funktioniert :) Ich hatte nicht die Änderung der ursprünglichen Datenbank. – Jazzepi

1

Sie können den folgenden Ausdruck versuchen. Was ich getan habe, ist, dass dein Ausdruck in zwei Teile zerschnitten wird, dann wird ein letzter 'IIf'-Check den Trick machen. Sie werden zusätzliche 2 Felder haben und Sie können diese ignorieren. Ich hatte die gleiche Situation und das hat gut für mich funktioniert. PS: Möglicherweise müssen Sie die schließenden Klammern im folgenden Ausdruck überprüfen. Ich habe es schnell gemacht.

Danke, Shibin

IIf(login.lang="ar","Arabic",IIf(login.lang="bg","Bulgarian",IIf(login.lang="zh_CN","Chinese (Simplified Han)",IIf(login.lang="zh_TW","Chinese (Traditional Han)",IIf(login.lang="cs","Czech",IIf(login.lang="da","Danish",IIf(login.lang="de","German",IIf(login.lang="en_US","United States English",IIf(login.lang="en_GB","British English",IIf(login.lang="es","Spanish",IIf(login.lang="fr","French",IIf(login.lang="el","Greek",IIf(login.lang="it","Italian",""))))))))))))) as l1, 

IIf(login.lang="ko","Korean",IIf(login.lang="hu","Hungarian",IIf(login.lang="nl","Dutch",IIf(login.lang="pl","Polish",IIf(login.lang="pt_PT","European Portuguese",IIf(login.lang="pt_BR","Brazilian Portuguese",IIf(login.lang="ru","Russian",IIf(login.lang="sk","Slovak",IIf(login.lang="sl","Slovenian","IIf(login.lang="fi","Finnish",IIf(login.lang="sv","Swedish",IIf(login.lang="tr","Turkish","Unknown")))))))))))) as l2, 

IIf(l1="",l2,l1) AS [Language] 
+0

Das ist ein schrecklicher Vorschlag - es speichert Daten in Ihrer SQL-Anweisung. -1 –

+1

@ David-W-Fenton: Es hängt von der Situation ab, ich hatte eine Situation, in der ich aufgrund extrem komplexer IIf-Bedingungen und anderer Gründe nur eingeschränkt neue Tabellen erstellen konnte. Ich habe diesen Vorschlag gemacht, da in der Frage auch erwähnt wird "stimme ich voll und ganz zu. Die Liste der Sprachen sollte eine Tabelle in der Datenbank gewesen sein und die login.lang sollte ein FK in dieser Tabelle gewesen sein. Leider ist dies nicht der Fall Datenbank wurde geschrieben, und es ist nicht wirklich meine zu ändern. " Lesen Sie die Frage vollständig durch, bevor Sie etwas "schrecklich" beurteilen – shibin

+0

Ich sehe keinen Grund, dass die ursprüngliche Datenbank geändert werden müsste.Die Anzahl der Zeilen in der Nachschlagetabelle reicht nicht aus, um ein Leistungsproblem zu verursachen, und natürlich kann es im Vergleich zur Codierung der Nachschlagewerte in SQL nicht langsamer sein. –

-1

Wenn Sie nicht eine Lookup-Tabelle verwenden können, eine benutzerdefinierte VB-Funktion erstellen, so dass statt 26 IIf-Anweisungen können Sie einen Funktionsaufruf haben.

Verwandte Themen