Слишком сложное выражение в Access 2007 - PullRequest
1 голос
/ 31 декабря 2010

Когда я пытаюсь выполнить этот запрос в Access через интерфейс ODBC в базу данных MySQL, я получаю ошибку «Слишком сложное выражение в выражении запроса». Самое важное, что я пытаюсь сделать, - это переводить сокращенные названия языков на английский язык. Мне было любопытно, если бы был какой-то способ «обмануть» доступ, думая, что выражение меньше с подзапросами, или кто-то еще лучше представлял, как решить эту проблему. Я думал о создании временной таблицы и ее объединении, но это не поддерживается в Access SQL.

Так же, как к вашему сведению, запрос работал нормально, пока я не добавил большую длинную цепочку IFF. Я проверил запрос в меньшей цепочке IFF для трех языков, и это не было проблемой, поэтому проблема определенно проистекает из огромной цепочки IFF (она глубже 26). Кроме того, я мог бы отказаться от некоторых опций (например, комбинировать различные формы китайского или португальского)

В качестве теста я смог заставить SQL-запрос работать после преобразования его в 14 операторов IFF (), но это далеко от 26 языков, которые я хотел бы представить.

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;

@ Майкл Тодд

Я полностью согласен. Список языков должен был быть таблицей в базе данных, а login.lang должен был быть FK в этой таблице. К сожалению, это не то, как база данных была написана, и это не мое изменение. Языки помещаются в поле login.lang PHP, работающим над базой данных.

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Вы можете попробовать приведенное ниже выражение. то, что я сделал, это то, что твое выражение сокращено до двух частей, а затем последняя проверка 'IIf' сделает свое дело. У вас будет 2 дополнительных поля, и вы можете их игнорировать. У меня была такая же ситуация, и это хорошо сработало для меня. PS: Возможно, вам придется дважды проверить закрывающие скобки в приведенном ниже выражении. Я сделал это быстро.

Спасибо, 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]
1 голос
/ 04 января 2011

Я думал о создании временной таблицы и ее объединении, но это не поддерживается в Access SQL.

Вы пробовали создать таблицу языков в Access и объединитьэто к таблицам MySQL?

0 голосов
/ 23 мая 2014

Если вы не можете использовать справочную таблицу, создайте пользовательскую функцию VB, чтобы вместо 26 операторов IIf у вас был один вызов функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...