web-dev-qa-db-ja.com

DB2エラー-SQLステートメントが長すぎるか複雑すぎる

DB2実動システムでこのエラーを取得する:

ERROR [HY000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0101 - SQL statement too long or complex.

次のように、ステートメントのWHERE句にORステートメントが多数あります。

...<sql statements and joins>
WHERE (a=x1 and b=y1)
  OR (a=x2 and b=y2)
  OR (a=x3 and b=y3)
... <4000 times>

バッチサイズを4000 ORステートメントよりも小さいものに縮小する必要があると考えています。提案はありますか?

4
Daniel Williams

私の推論が正しいかどうかはわからないので、これはおそらく回答ではなくコメントになるはずですが、書式を設定することはできません。

代わりに一時テーブルとJOINを作成できますか?

...<sql statements and joins>
JOIN tmp_table ON my_table.a = tmp_table AND my_table.b = tmp_table.b

編集:チェックする値がほとんど変わらない場合は、テーブルにそれらを永続化してパフォーマンスを向上させ、クエリを容易にすることにも意味があります。

3
Petter Brodin

使用しているi5/OSのバージョンがわからない。これは V5R4ドキュメント からです。しかし、あなたが遭遇するかもしれないもの:

1 - The total number of subselects in a fullselect (UNION or UNION ALL clause) is greater than 32.
2 - The total number of columns, constants, and operators is greater than the SQL limits.
3 - The sum of the lengths of the non-LOB columns in a select list, table, view definition, or user defined table function is greater than 32766 or the definition contains a LOB and the sum of the lengths specified on the ALLOCATE clause for varying-length fields and the non-varying field lengths is greater than 32740. The maximum length is reduced if any of the columns are varying-length or allow null values.
4 - The total number of nested subselects is greater than 31.
5 - The total length of the statement text is greater than 65535.
6 - The relative position value specified on the FETCH statement is outside the range of valid values.
7 - A system name could not be generated.

IBMの推奨は、SQLを分割することです。その場合、Petterはかなり良いアイデアです。それ以外の場合は、複数回クエリを実行し、後で結果を結合する必要があります。

1
Chris Aldrich