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 アクセスの実行中に、「クエリが複雑すぎます」という例外がスローされます。明らかにOR、ミリ秒アクセスで 99 に制限されている s の数が原因です。このクエリを変更して、これを使用しないようにする方法OR... OR...OR構造?

4

2 に答える 2

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 に答える
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 に答える