operador - SQL Server-cláusula IN con múltiples campos
select sql server in (8)
¿Qué tal esto en su lugar?
SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType
¿Es posible incluir en una cláusula IN
múltiples campos? Algo como lo siguiente:
select * from user
where code, userType in ( select code, userType from userType )
Estoy usando ms sql server 2008
Sé que esto se puede lograr con uniones y existe, solo quería saber si podría hacerse con la cláusula IN
.
No creo que la consulta sea bastante portátil, sería más seguro usar algo como
select * from user
where code in ( select code from userType ) and userType in (select userType from userType)
No de la manera que has publicado. Solo puede devolver un solo campo o tipo para que IN
funcione.
Desde 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
, puedes usar un JOIN
usando los dos campos:
SELECT U.*
FROM user U
INNER JOIN userType UT
ON U.code = UT.code
AND U.userType = UT.userType
Podrías 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)
Puedes usar uniones
SELECT * FROM user U
INNER JOIN userType UT on U.code = UT.code
AND U.userType = UT.userType
Solo con algo horrible, como
select * from user
where (code + userType) in ( select code + userType from userType )
Luego tienes que administrar los nulos y los números de concatenación en lugar de agregarlos, y lanzar, y un código de 12 y un tipo de usuario de 3 frente a un código de 1 y un tipo de usuario de 23, y ...
Así que ya está: una solución que no usa uniones o existe ... y un montón de razones por las que no debería usarla;)
Tenía que hacer algo muy similar, pero EXISTS no funcionaba en mi situación. Esto 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 lo veo, esto está muy cerca de la respuesta de @ v1v3kn
select * from user
where (code, userType) in ( select code, userType from userType );