Access 2007中的表达式过于复杂

时间:2010-12-31 06:16:29

标签: sql ms-access-2007

当我尝试通过ODBC接口在Access中将此查询运行到MySQL数据库时,我得到“表达式在查询表达式中过于复杂”错误。我正在尝试做的重要事情是将语言的缩写名称翻译成完整的英语对应词。我很好奇是否有某种方法可以“欺骗”访问,认为子查询表达式较小,或者其他人如何更好地了解如何解决这个问题。我考虑过创建一个临时表并对其进行连接,但是在Access SQL中不支持。

就像一个FYI一样,查询工作正常,直到我添加了一个很长的IFF链。我在一个较小的IFF链上测试了三种语言的查询,这不是问题,所以问题肯定源于巨大的IFF链(它是26深)。此外,我可能会放弃一些选项(比如组合不同形式的中文或葡萄牙语)

作为测试,我能够在将SQL查询削减到14个IFF()语句后才能使SQL查询正常工作,但这与我想表达的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;

@ Michael Todd

我完全同意。语言列表应该是数据库中的一个表,login.lang应该是该表中的FK。不幸的是,这不是数据库的编写方式,并不是我的修改。这些语言由运行在数据库顶部的PHP放入login.lang字段中。

3 个答案:

答案 0 :(得分:1)

  

我考虑过创建一个临时表并对其进行连接,但是在Access SQL中不支持。

您是否尝试在Access中创建一个语言表,并将其加入MySQL表?

答案 1 :(得分:1)

您可以尝试使用以下表达式。我所做的是,你的表达式被分解为两个部分,然后最终的'IIf'检查就可以了。您将有另外2个字段,您可以忽略它们。我有同样的情况,这对我很有用。 PS:您可能需要仔细检查以下表达式中的右括号。我很快就做到了。

谢谢, 世斌

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]

答案 2 :(得分:0)

如果您不能使用查找表,请创建一个自定义VB函数,这样您就可以调用一个函数来代替26个IIf语句。