2016-05-03 11 views
2

私はこのSQL Serverの:128個の値

SELECT * 
FROM table 
WHERE id IN (thousands of ids) 

のようなクエリを書いていますが、WHERE INの値の上限は、私たちのバージョンに128をあるので、これは動作しませんのを回避するにはどのようにWHEREに限界SQLサーバー。

サブクエリを使用して結合するか、または一時テーブルを使用してこれを行う方法はありますか?

ご協力いただきましてありがとうございます。

+3

確かに、すべてのIdを '#TEMP'または' @ TABLE'に挿入してから、idに結合しますか? – StuartLC

+0

何千というIDはどこから来ていますか?それらは別のクエリから生成されていますか? –

+1

私の知る限り、SQL Serverにはそのような制限はありません。これは、介在するソフトウェアによって課されることがあります。私はそれが限界があるならば* 128ではないと確信しています。 –

答えて

4

あなたはすべての値が考慮されるために含むと、このテーブルにJOINのインラインテーブルを構築するためにVALUESを使用することができます。

SELECT t1.* 
FROM table AS t1 
INNER JOIN (VALUES (10), (20), (12), ...) AS t2(id) 
ON t1.id = t2.id 
+1

Waowwwwwこれまでにこれを見たことがない。驚くべきアプローチ – shzyincu

+0

NIceプラグですが、サブクエリで結合するのではなくサブクエリで使用する方が良いでしょう coz論理ツリーは結合とサブクエリでは同じではないため、導出されたカーディナリティーフェーズ後に物理的にSEMI JOINを選択します。簡単な例を以下: は、テーブルT(ID INT) SELECT T1を作成* T1 AS インナー(VALUES(10)、(20)、(12))、T2(ID)AS T1 ON JOINからのT。 .ID = t2.id SELECT T1 * T FROM T1 が存在する AS( は(VALUES(10)、(20)、(12)SELECT * FROM)T2(ID)AS ここで、t2.id = t1.id **実行計画を参照してください** –

3

一時テーブルに入れ、それらをして

SELECT * 
FROM table 
WHERE id IN (SELECT id from #Table_of_thousands_of_ids) 
+0

良い選択。誰かがEFや他のORMチームにもこれをサポートするように教えてください;)しかし、これはやり方です(またはクエリで作業するのが簡単なテーブル変数を使用する)。 – TomTom

1

すべてのIDを挿入してテーブルと内部結合する一時テーブルを使用する必要があります

DECLARE @tmpTable TABLE 
(
    Id int 
) 

Insert into @tmpTable (id) values (1), (2), (3) 

SELECT * 
FROM [table] 
Inner join @tmpTable on [table].id = @tmpTable.id