読者です 読者をやめる 読者になる 読者になる

炊きたてのご飯が食べたい

定時に帰れるっていいね。自宅勤務できるっていいね。子どもと炊きたてのご飯が食べられる。アクトインディでは積極的にエンジニアを募集中です。

( Oracle ) 【解決】 比較演算子 IN句に1000件以上指定すると、エラーが発生

SQL

Oracleには、リストに式を最大1000件までしか書けないという制限がある為、
IN句には最大で1000件までしか指定できないみたい。
IN句の要素数が1000件を超えると「ORA-01795: リストに指定できる式の最大数は1000です。」というエラーが発生します。
そうゆうときは、IN句ではなく、EXISTS句で対応
例)
製品情報が入っているproductテーブル
顧客情報が入っているuserテーブル
・product には 製品番号 product_id があり
・user には 購入商品番号 product_id_fk を持つ
・product_id_fkは1001件のレコードが格納されている場合
購入履歴の製品を調べる下記SQLはエラーとなる。

SELECT
*
FROM
product A
WHERE
A.product_id IN ( SELECT B.product_id_fk FROM user B )

これをEXISTS句で書き直すと

SELECT
*
FROM
product A
WHERE
EXISTS( SELECT 'X' FROM user B WHERE A.product_id = B.product_id_fk );

EXISTS の方が圧倒的に速く動作することからも、
EXISTSで表記する書き方で慣れておいたほうがいいのかも。