2012-06-21 39 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不直接支持臨時表,因此,如果有在同一數據庫上工作的多個併發客戶端,你必須爲每一個他們的唯一命名臨時表(和調整相應地查詢)。