2011-11-18 16 views
6

Mam więc straszne zapytanie, że obecny istnieje w MS Access, który próbuję przepisać w SQL Server. Zasadniczo otrzymuję dane pochodzące z pliku tekstowego, który próbuję odfiltrować na podstawie określonych kryteriów.SQL gdzie klauzula z LIKE i IN

Moje problemy wiążą się ze sposobem, w jaki dane znajdują się w pliku tekstowym. Moja tabela jest podobna do tej:

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

Mam tabeli danych, który ma datę, a następnie ma 16 kolumn z danymi, który został dodany przez innego użytkownika. Istnieje kilka innych pól w tej tabeli, ale są one niepotrzebne na to pytanie.

Bieżąca kwerenda filtruje na 15 wartościach, gdzie identyfikator użytkownika jest podobny do czegoś.

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%'...) 

Co próbuję zrobić, to przechowywać podobne wartości w tabeli, dzięki czemu mogę dołączyć do nich w moim zapytaniu. Nie znam wszystkich wartości, więc potrzebuję użyć symbolu wieloznacznego, ponieważ może to być dowolna kombinacja znaków alfanumerycznych. Więc mam tabeli jak poniżej:

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

Wtedy moja kwerenda byłoby coś podobnego do tego, ale nie sądzę, jest to możliwe

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

Czy można zrobić coś takiego? Jeśli tak, to jakiej składni należy użyć, ponieważ jestem całkowicie zaskoczony.

+0

Model danych jest źle. Czy możesz zmienić strukturę danych tak, aby każdy wiersz tabeli 1 zawierał dane dla pojedynczego użytkownika/kwoty/danych biznesowych? Powinieneś być w stanie stworzyć istniejącą strukturę za pomocą zapytania przestawnego, a filtrowanie będzie DUŻO łatwiejsze. –

+1

@JimGarrison Zgadzam się, że filtrowanie w ten sposób byłoby o wiele łatwiejsze, ale restrukturyzacja danych byłaby trudna. Ten plik zawiera dużo więcej pól niż to, co pokazałem powyżej około 70 kolumn danych, co byłoby bardzo trudne. – Taryn

+3

zrównoważenie sił zła z dobrym – swasheck

Odpowiedz

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

Albo (2008 składnia)

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

działa idealnie, dziękuję bardzo. – Taryn