2011-11-18 27 views
6

Tengo una terrible consulta sobre la existencia actual en MS Access que intento reescribir en SQL Server. Básicamente obtengo datos que provienen de un archivo de texto que estoy tratando de filtrar según criterios específicos.Cláusula SQL Where con LIKE e IN

Mis problemas vienen con la forma en que los datos están en el archivo de texto. Mi tabla es similar a esto:

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

Tengo una tabla de datos que tiene la fecha y luego tiene 16 columnas con datos que se han añadido por un usuario diferente. Hay algunos otros campos en esta tabla pero no son necesarios para esta pregunta.

La consulta actual filtra en 15 valores donde el ID de usuario es como algo.

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

Lo que trato de hacer es almacenar los valores similares en una tabla para que pueda unirme a ellos en mi consulta. No conozco todos los valores, así que necesito usar el comodín porque podría ser cualquier combinación posible de caracteres alfanuméricos. Así que voy a tener una tabla como la siguiente:

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

Entonces mi consulta sería algo parecido a esto, pero no creo que esto es posible

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

¿Es posible hacer algo como esto? Si es así, ¿qué sintaxis debería usarse porque estoy totalmente perplejo?

+0

El modelo de datos es incorrecto. ¿Puede reestructurar los datos para que cada fila de Table1 contenga datos para un solo usuario/cantidad/businessDate? Debería poder crear la estructura existente usando una consulta dinámica, y el filtrado será MUCHO más fácil. –

+1

@JimGarrison Estoy de acuerdo en que sería mucho más fácil filtrar de esa manera, pero reestructurar los datos sería difícil. Este archivo tiene muchos más campos que lo que mostré anteriormente sobre 70 columnas de datos, sería muy difícil. – Taryn

+3

equilibrar las fuerzas del mal con el bien – swasheck

Respuesta

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

O (2008 sintaxis)

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

funciona a la perfección, muchas gracias. – Taryn