2011-11-18 168 views
6

所以我有一個糟糕的查詢,目前存在於MS Access中,我試圖在SQL Server中重寫。基本上,我從一個文本文件中獲取數據,我試圖根據特定條件對其進行過濾。SQL Where和LIKE和IN條款

我的問題來自數據在文本文件中的方式。我的表是與此類似:

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

我有了日期,然後有16列與已經由其他用戶添加數據的數據表。本表中還有其他一些字段,但對於這個問題它們是不必要的。

當前查詢對15個值進行過濾,其中userId就像是某個東西。

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

@JimGarrison我同意過濾這種方式會容易得多,但重構數據將會很困難。這個文件比我在上面顯示的大約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