2009-03-10 11 views
0

従業員をコードと部門に基づいて検索しようとしています。クエリ実行中の "IN"の問題

私は1200の従業員コードを持つIN演算子を使用してクエリをトリガしました。私はクエリを実行したときに例外が発生しました( "INで最大1000レコードが許可されました")。

誰でもこの問題で私を助けることができます。

+0

SQLコード –

+0

を投稿してください。実際に1200エントリのIN文を見たいですか? – kdgregory

+0

D'ohあなたのコメントは、私が間違ったことを尋ねていたことを実感しました;-)ありがとう。 – RuudKok

答えて

1

多くのDBMSは、より多くので

SELECT * FROM table WHERE col IN (...) 

ようなクエリを許可していません。リスト内の1,000以上の値。

SELECT * FROM table WHERE col IN (...) OR col IN (...) 

または

SELECT * FROM table WHERE col IN (...) 
UNION 
SELECT * FROM table WHERE col IN (...) 

(それが意味をなすと仕事にはほとんどありませんではないでしょうが):多分1,000未満の値のチャンクを使用して、それを分割することが可能です。

それ以外の場合は、一時テーブルに値を格納し、代わりにJOINを使用する必要があります。あなたは1,200のコードをどこから入手しますか?同じデータベースに存在することはありませんか? :)

+0

から従業員コードを取得するためのプロシージャを格納しているので、多くのINクエリを使用すると良いですか? パフォーマンスには影響しません –

+0

DBMSがどのくらいスマートであるかによって異なります。索引付き列を持つ一時表を使用するほうがおそらく高速です。率直に言って、あなたのテーブルをリファクタリングするのは良い考えです! –

5

これらのレコードを一時テーブルにアップロードし、結合を使用することは、ほぼ確実にはるかに高速になるでしょう。つまり、パーサーはINのために巨大な条件ツリーを構築する必要があります。

注:MYSQLがOracleまたはSQLServerのトランザクションレベルのテンポラリテーブルをサポートしているかどうかはわかりませんが、特に実際に作成されたテーブルは高速でなければなりません。もちろん、テーブルへの一括挿入機能、トランザクションログの書き込みコスト、& cなど、多くの変数があります。

あなたの質問を再読する:あなたはその従業員コードをどこから手に入れますか?あなたはテーブルから彼らを得ることができますか?

+0

それが格納されているプロシージャ・コールを取得するWHERE b.t2_id = c.t3_t2_Id ONのT3 C をJOIN他のデータベース(テーブル)からの従業員コード。 –

0

あなたの従業員のコードが含まれています(一時的な)表を作成し、それを埋める、このようなクエリ:

SELECT * 
FROM mytable 
WHERE empcode IN (SELECT mycode FROM temptable) 
+0

これは高速でしょうか。私はすでに他のテーブル –

0

メモリ内の一時テーブル(小さなテーブルのみ)を作成し、ストアドプロシージャの結果を設定します。テンポラリ・テーブルの結合を使用して選択を実行します。テンポラリテーブルを削除します。

CREATE TEMPORARY TABLE ENGINE=MEMORY tmp AS 
    SELECT code FROM employee; // in-memory temporary table (small tables) 

SELECT col1, col2 FROM table 
    INNER JOIN tmp ON table.code = tmp.code; // join faster than subquery 

DROP TEMPORARY TABLE tmp; // cleanup temporary table 
関連する問題