1

在应用程序中的某些地方有一个自动生成的查询,例如

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 访问会抛出异常“查询太复杂”。显然是因为ORs 的数量在 ms 访问中被限制为 99。如何更改此查询并避免使用此OR……构造OROR

4

2 回答 2

4

如果您可以自己影响查询创建,则可以简单地使用

    SELECT DISTINCT `Name`,`Number` FROM `Table` WHERE `ID` IN (@NAZ_ID_0,@NAZ_ID_1,etc)

如果您无法控制查询的创建,但可以在使用之前对其进行更改,则可以尝试将 or-s 替换为 in-variant。最后,如果 IN() 也太复杂,您可以考虑创建一个临时表,用变量填充它并在原始查询中使用子查询。

于 2012-06-21T09:37:56.590 回答
4

在“大”DBMS 中,解决这类问题的常用方法是创建一个临时表,然后像这样重写查询:

SELECT DISTINCT `Name`,`Number` FROM `Table`
WHERE `ID` IN (SELECT `ID` FROM TemporaryTable)

因此,无需分配绑定参数@NAZ_ID_X,只需在执行查询之前将这些相同的值插入到临时表中。

此外,这可以更轻松地避免动态构建 SQL 文本并获得查询准备的好处。

不幸的是,Access 不直接支持临时表,因此如果有多个并发客户端在同一个数据库上工作,您必须为每个客户端生成一个唯一命名的临时表(并相应地调整查询)。

于 2012-06-21T09:47:23.697 回答