应用程序中的某些位置有一个自动生成的查询,如
SELECT DISTINCT `Name`,`Number`
FROM `Table`
WHERE (`ID`=@NAZ_ID_0)
OR (`ID`=@NAZ_ID_1)
OR (`ID`=@NAZ_ID_2)
OR (`ID`=@NAZ_ID_3)
...
OR (`ID`=@NAZ_ID_690)
执行此查询时,ms访问会抛出异常“查询过于复杂”。显然是因为OR
的数量限制为99毫秒访问。
如何更改此查询并避免使用此OR
... OR
... OR
构建?
答案 0 :(得分:4)
如果您可以自己影响查询创建,则只需使用
即可 SELECT DISTINCT `Name`,`Number` FROM `Table` WHERE `ID` IN (@NAZ_ID_0,@NAZ_ID_1,etc)
如果您无法控制查询的创建,但可以在使用之前对其进行更改,则可以尝试将in-s替换为in-variant。 最后,如果IN()也太复杂,您可以考虑创建一个临时表,用变量填充它并在原始查询中使用子查询。
答案 1 :(得分:4)
在“大”DBMS下,解决这些问题的常用方法是创建一个临时表,并重写这样的查询:
SELECT DISTINCT `Name`,`Number` FROM `Table`
WHERE `ID` IN (SELECT `ID` FROM TemporaryTable)
因此,在执行查询之前,只需将这些相同的值插入临时表,而不是分配绑定参数@NAZ_ID_X
。
此外,这样可以更轻松地避免动态构建SQL文本并获得查询preparation的好处。
不幸的是,Access不直接支持临时表,因此如果有多个并发客户端在同一个数据库上工作,则必须为每个客户端生成一个唯一命名的临时表(并相应地调整查询)。