人気ブログランキング | 話題のタグを見る
OLEDB JETでクエリを投げると、式が複雑すぎますと怒られた

ADO.Net を使って MDBへ のクエリ実行時に「式が複雑すぎます。」という例外で怒られました。

確かに、WHERE句に相当数の条件を入れています。
例えばこんな感じ。(パラメータクエリを使ってます。詳しくは(ADO.Net)OLEDB経由でのMDBへの副問い合わせにパラメータクエリを使うとおかしくなることがある)

PARAMETERS
pCondBirthday1 Char ,
pCondBirthday2 Char ,
pCondBirthday3 Char ,
pCondPref1 Text ,
pCondPref2 Text ,
pCondPref3 Text ;
SELECT *
FROM Customer
WHERE
(
Birthday = pCondBirthday1 OR
Birthday = pCondBirthday2 OR
Birthday = pCondBirthday3 OR
[省略]
) AND (
Pref = pCondPref1 OR
Pref = pCondPref2 OR
Pref = pCondPref3 OR
[省略]
)

どうやら WHERE句に条件大量にあるとダメみたいです。具体的のどれくらいの数を超えたらNGかというのは見つかりませんでした。

で、上記のSQLの場合、特に一つのフィールドに対して複数の OR 条件が大量の設定してます。
これは IN句を使うべきと同僚に言われてました。
言われてみれば、そんなのもあったなと。。今まで、副問い合わせで複数値が返るときにか使ってませんでした。。

ということで、下記のように OR 条件を IN句に置き換えたらエラーはでなくなりましたとさ。
(パラメータ定義部分は省略)

SELECT *
FROM Customer
WHERE
Birthday IN ( pCondBirthday1 ,
pCondBirthday2 ,
pCondBirthday3 ,
[省略]
)
AND
Pref IN ( pCondPref1 ,
pCondPref2 ,
pCondPref3 ,
[省略]
)

ま、結局は3流PGのSQLの知識不足ということでした。

参考:
「式が複雑すぎます」の具体的な条件
by jehoshaphat | 2009-08-02 01:13 | SQL


<< (SQL)SQL Server... AccessとOLEDB JE... >>