SELECT *
FROM table
WHERE id IN (thousands of ids)
のようなクエリを書いていますが、WHERE IN
の値の上限は、私たちのバージョンに128をあるので、これは動作しませんのを回避するにはどのようにWHEREに限界SQLサーバー。
サブクエリを使用して結合するか、または一時テーブルを使用してこれを行う方法はありますか?
ご協力いただきましてありがとうございます。
SELECT *
FROM table
WHERE id IN (thousands of ids)
のようなクエリを書いていますが、WHERE IN
の値の上限は、私たちのバージョンに128をあるので、これは動作しませんのを回避するにはどのようにWHEREに限界SQLサーバー。
サブクエリを使用して結合するか、または一時テーブルを使用してこれを行う方法はありますか?
ご協力いただきましてありがとうございます。
あなたはすべての値が考慮されるために含むと、このテーブルにJOIN
のインラインテーブルを構築するためにVALUES
を使用することができます。
SELECT t1.*
FROM table AS t1
INNER JOIN (VALUES (10), (20), (12), ...) AS t2(id)
ON t1.id = t2.id
Waowwwwwこれまでにこれを見たことがない。驚くべきアプローチ – shzyincu
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 **実行計画を参照してください** –
一時テーブルに入れ、それらをして
SELECT *
FROM table
WHERE id IN (SELECT id from #Table_of_thousands_of_ids)
良い選択。誰かがEFや他のORMチームにもこれをサポートするように教えてください;)しかし、これはやり方です(またはクエリで作業するのが簡単なテーブル変数を使用する)。 – TomTom
すべての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
確かに、すべてのIdを '#TEMP'または' @ TABLE'に挿入してから、idに結合しますか? – StuartLC
何千というIDはどこから来ていますか?それらは別のクエリから生成されていますか? –
私の知る限り、SQL Serverにはそのような制限はありません。これは、介在するソフトウェアによって課されることがあります。私はそれが限界があるならば* 128ではないと確信しています。 –