2010-12-15 13 views
15

¿Es posible incluir en una cláusula IN múltiples campos? Algo así como lo siguiente:SQL Server - cláusula IN con múltiples campos

select * from user 
where code, userType in (select code, userType from userType) 

estoy usando MS SQL Server 2008


Sé que esto puede lograrse con Uniones y existe, sólo quería saber si sólo se podría hacer con la cláusula IN.

+4

El hecho de que usted espera * dos columnas * de una tabla para estar "en" una La segunda tabla insinúa un diseño de esquema que necesita una mayor normalización. –

Respuesta

14

No es la forma en que ha publicado. Solo puede devolver un solo campo o escriba IN para que funcione.

De MSDN (IN):

test_expression [ NOT ] IN 
    (subquery | expression [ ,...n ] 
    ) 

subquery - Is a subquery that has a result set of one column. 
      This column must have the same data type as test_expression. 

expression[ ,... n ] - Is a list of expressions to test for a match. 
         All expressions must be of the same type as 
         test_expression. 

En lugar de IN, se puede utilizar un JOIN utilizando los dos campos:

SELECT U.* 
FROM user U 
    INNER JOIN userType UT 
    ON U.code = UT.code 
    AND U.userType = UT.userType 
+0

yeap, sospechaba que no era posible – opensas

+0

http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/4e058e95-9d7c-4baa-a73e-3c849b4c6463
eliminar de test1 en los que no existe (seleccione 0 de test2 donde test1.col1 = test2.col1 y test1.col2 = test2.col2) – Vijay

+0

@Vijay - ¿Qué está tratando de decir aquí? – Oded

0

¿Qué hay de esto en su lugar:

SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType 
9

Puede usar un formulario como este:

select * from user u 
where exists (select 1 from userType ut 
       where u.code = ut.code 
       and u.userType = ut.userType) 
+0

sí, generalmente lo hago de esa manera, tratando de evitar el existente ... – opensas

+1

Bueno, es probable que tengas que usar 'EXISTS' o' JOIN' para lograr esto. – cdhowie

+0

sí, cdhowie, de eso se trataba mi pregunta ... – opensas

-2

No creo que la consulta es muy portátil, que sería más seguro que usar algo como

select * from user 
where code in (select code from userType) and userType in (select userType from userType) 
+1

mmmm ... Supongo que no es lo mismo, estoy buscando UN registro con el mismo código y userType ... – opensas

+1

Eso no funcionará. Es posible que tenga un registro que coincida con su 'código' y otro registro que coincida con su' userType'. – Andrew

0

También se puede usar une

SELECT * FROM user U 
INNER JOIN userType UT on U.code = UT.code 
AND U.userType = UT.userType 
+0

Creo que ambas consultas no son equivalentes, la segunda consulta puede coincidir con dos registros diferentes de la tabla userType – opensas

+0

Hmmm ... tienes razón. Pero podría ser cualquiera, depende de lo que él quiera. Como él aceptó la respuesta con combinaciones, debe ser esa. Editado mi respuesta. Gracias. – pavanred

-3
select * from user 
where (code, userType) in (select code, userType from userType); 
+4

Eso funciona en Oracle, pero no en SQLS –

4

Sólo con algo horrible, como

select * from user 
where (code + userType) in (select code + userType from userType) 

Luego tiene que administrar nulos y concatenar números en lugar de agregarlos, y fundición, y un código de 12 y un tipo de uso de 3 contra un código de 1 y un tipo de uso de 23, y ...

Así que hay ya va: una solución que no usa combinaciones o existe ... y un montón de razones por las que no debería usarla;)

+0

Lo he usado, sin embargo, solo funciona si los campos son ambas cadenas. Además, recomiendo usar un carácter entre los dos campos como '|' i.e. 'donde (código + '|' + userType) en (seleccione el código + '|' + userType from userType)'. Pero estoy de acuerdo en que no es una gran solución. – Andrew

0

Tuve que hacer algo muy similar pero EXISTS no funcionó en mi situación. Aquí es lo que funcionó para mí:

UPDATE tempFinalTbl 
SET BillStatus = 'Non-Compliant' 
WHERE ENTCustomerNo IN (SELECT DISTINCT CustNmbr 
      FROM tempDetailTbl dtl 
      WHERE dtl.[Billing Status] = 'NEEDS FURTHER REVIEW' 
       AND dtl.CustNmbr = ENTCustomerNo 
       AND dtl.[Service] = [Service]) 
    AND [Service] IN (SELECT DISTINCT [Service] 
      FROM tempDetailTbl dtl 
      WHERE dtl.[Billing Status] = 'NEEDS FURTHER REVIEW' 
       AND dtl.CustNmbr = ENTCustomerNo 
       AND dtl.[Service] = [Service]) 

EDIT: Ahora que miro, esto está muy cerca de @ v1v3kn respuesta

Cuestiones relacionadas