2012-06-21 40 views
1

在应用一些地方有像查询是太复杂。如何修改查询?

SELECT DISTINCT `Name`,`Number` 
FROM `Table` 
WHERE (`ID`[email protected]_ID_0) 
    OR (`ID`[email protected]_ID_1) 
    OR (`ID`[email protected]_ID_2) 
    OR (`ID`[email protected]_ID_3) 
    ... 
    OR (`ID`[email protected]_ID_690) 

自动生成的查询当执行此查询的MS Access抛出异常“查询是太复杂”。因为OR的号码被限制到99在MS Access的很明显。 如何改变这种查询,并避免使用此OR ... OR ... OR建设?

+1

这些是什么? 700个参数? –

回答

3

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

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

如果你无法控制查询的创作,但使用数据之前可以改变它,你可以尝试更换或-s与in-variant。 最后,如果IN()也太复杂,你可能会考虑创建一个临时表,与变量填充它,并在原来的查询使用子查询。

+0

是否有这些中参数的数量限制的另一个? –

+0

@说实话,我不确定在oledb提供程序中是否有参数本身的限制,但不应该在语句本身中包含大量元素。当然,总是需要考虑最大查询长度,大约64.000个字符。如果您达到最大值,则必须使用替代方法,如临时表。 –

3

在“大”的DBMS,解决这类问题的常用方法是创建一个临时表,并改写本查询:

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

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

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

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