2

簡単な質問です。ユーザーが手動で入力した単一の値を使用し、次のような 2 つの列を比較する SQL クエリを実行しています。

SELECT col3,col1,col4 FROM table WHERE
col1='SomeReallyLongText' OR col2='SomeReallyLongText'

SomeReallyLongText の繰り返しは許容範囲ですが、私のプログラムは数百行の Excel ドキュメントのループもサポートしています。

SELECT col3,col1,col4 FROM table WHERE
col1 IN('item1','item2',...'itemN') OR col2 IN('item1','item2',...'itemN')

そして、クエリは非常に長くなり、効率的とは思えません。 2 つの列を同じ IN(xxx) セットと比較できるように、これを短縮する方法はありますか?

そうでない場合、クエリで一連の値を指定する他の (より効率的な) 方法はありますか?

(私は、.NET 4.0 クライアント プロファイルで C# を使用し、Excel Interop を使用してファイルにアクセスしています)

4

2 に答える 2

3

これで得られるパフォーマンスについてはよくわかりません:

SELECT col3,col1,col4 FROM table
WHERE EXISTS (
    SELECT 1
    FROM (VALUES
        ('item1')
        , ('item2')
        , ...
        , ('itemN')
    ) AS It(m)
    WHERE It.m IN (col1, col2, ...)
)   
于 2013-05-15T09:46:40.303 に答える
1

IN句 内で使用されるすべての値を格納する一時テーブルを作成できます

IF OBJECT_ID('tempdb..#Sample') IS NOT NULL DROP TABLE #Sample

Create table #Sample
(name varchar(20))

Insert into #Sample
values
('item1'),('Item2'),....

SELECT col3,col1,col4 FROM table WHERE
col1 IN ( Select name from #Sample) OR col2 IN(Select name from #Sample)

または、使用している場合はLinq to SQL、コレクションにExcelデータを保存し、Containsメソッドを使用してDBにクエリを実行できます

var excelVal = new string[] { 'item1','item2'... };
var result = from x in Table
             where excelVal .Contains(x.Col1) || excelVal.Contains(x.Col2)
             select x;
于 2013-05-15T09:43:15.110 に答える