查询过于复杂。如何修改查询?

时间:2012-06-21 09:35:45

标签: c# sql ms-access

应用程序中的某些位置有一个自动生成的查询,如

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构建?

2 个答案:

答案 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不直接支持临时表,因此如果有多个并发客户端在同一个数据库上工作,则必须为每个客户端生成一个唯一命名的临时表(并相应地调整查询)。