2011-11-18 38 views
6

SQL Serverで書き換えようとしているMS Accessに現在存在するという酷いクエリがあります。基本的には、特定の基準に基づいてフィルタリングしようとしているテキストファイルのデータを取得します。SQL Where句をLIKEとINで使用

私の問題は、データがテキストファイルに書き込まれる方法に伴い発生します。私のテーブルには、次のようになります。

Table1 
BusinessDate DateTime 
Amount   money 
User1   varchar 
User2   varchar 
User3   varchar 
User4   varchar 
...   varchar 
User16   varchar 

私は日付を持っているし、別のユーザーによって追加されたデータを16列を持つデータテーブルを持っています。この表にはいくつかのフィールドがありますが、この質問には不要です。

userIdが何かのような15の値に対して現在のクエリがフィルタリングします。

SELECT * 
FROM Table1 
WHERE (User1 Like 'AB%' Or User1 Like 'CD%' Or User1 Like 'EF%'...) 
OR (User2 Like 'AB%' Or User2 Like 'CD%' Or User2 Like 'EF%'...) 

私がしようとしているのは、同じ値をテーブルに格納して、私のクエリでそれらに参加できるようにすることです。私はすべての値がわからないので、ワイルドカードを使用する必要があります。なぜなら、英数字を組み合わせることができるからです。だから私はこのようなテーブルを持っています。そして、私のクエリは次のようなものになるだろう

ValueTable 
AB% 
CD% 
EF% 
HI% 
... 

が、私はこれが可能

SELECT * 
FROM Table1 
WHERE User1 Like IN (SELECT Value FROM ValueTable) 
OR User2 Like IN (SELECT Value FROM ValueTable) 

ではないと思います。このような何かをすることは可能ですか?もしそうなら、私は完全に困惑しているので、どの構文を使うべきですか?

+0

データモデルが間違っています。各Table1行に1人のユーザー/金額/ businessDateのデータが含まれるようにデータを再構成できますか?ピボットクエリを使用して既存の構造を作成することができるはずです。フィルタリングはずっと簡単です。 –

+1

@ジムガリソン私はそれをはるかに簡単にフィルタリングすることは容易だが、データを再構成することは難しいだろう。このファイルは、私が上に示した約70列のデータよりも多くのフィールドを持っており、非常に難しいでしょう。 – Taryn

+3

悪の勢力とのバランスをとって – swasheck

答えて

11
SELECT * 
FROM Table1 
WHERE EXISTS (SELECT * 
       FROM ValueTable 
       WHERE User1 Like Value 
         OR User2 Like Value) 

それとも(2008構文)

SELECT * 
FROM Table1 
WHERE EXISTS (SELECT * 
       FROM (VALUES(User1), 
          (User2), 
          (User3), 
          (User4), 
          /* ... */ 
          (User15), 
          (User16)) Users(U) 
         JOIN ValueTable 
         ON U Like Value) 
+0

が完璧に働くので、どうもありがとう。 – Taryn